<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><!-- generator="FeedCreator 1.7.3" --><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
	<channel>
		<title>Blog entries</title>
		<description>Blog entries</description>
		<link>http://www.nearsoft.com</link>
		<lastBuildDate>Sun, 26 May 2013 04:29:06 +0100</lastBuildDate>
        <generator>FeedCreator 1.7.3</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/nearsoft/blog" /><feedburner:info uri="nearsoft/blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
			<title>The Logic behind Nearsoft's Logic Test</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/rq516RpNkS8/the-logic-behind-nearsofts-logic-test.html</link>
			<description>&lt;p&gt;It's not about logic, it's all about self-discipline.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The Nearsoft "Logic" Test is not about first order logic.&amp;nbsp; Rather it is a programming test, but at the time it was first conceived (by an unknown source, not us), "code" was referred to as "logic."&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;On a couple of occasions, candidates (who have not passed it) have, let's say, “questioned” the purpose and validity of the Logic Test. Nevertheless, the validity of this test &lt;i&gt;&lt;b&gt;is&lt;/b&gt;&lt;/i&gt; supported by solid research.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;It's about Self-Discipline&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The Logic Test measures, in relative terms, a candidate's level of self-discipline.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Like the classical “Head to Toe" game, the test “&lt;i&gt;provides a good indicator of the level of&amp;nbsp; self-discipline needed to achieve important aims and ambitions.&lt;/i&gt;"&amp;nbsp; In the “Head to Toe” game, children are asked to do something counter-intuitive: they must touch their toes when the instructor tells them to “touch your head” and touch their heads when the instructor tells them to “touch your toes.”&amp;nbsp; Each time they do this, they are given 2 points for the correct response (&lt;i&gt;i.e.&lt;/i&gt;, he opposite of what the instructor says), 1 point if they start to motion towards the incorrect response but then correct themselves and 0 points for the incorrect response. In the original research by Tominey and McClelland, they had the kids do this 20 times, “&lt;i&gt;with higher scores indicating higher levels of behavioral regulation.&lt;/i&gt;”&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;For obvious reasons, instead of asking adults we've barely met to play the Head to Toe game, we invite them to take the Logic Test.&amp;nbsp;&amp;nbsp; As in the game, the Logic Test puts developers in the position of following counter-intuitive rules.&amp;nbsp; Most modern programming languages share pretty standardized rules and developers internalize the rules early in their careers.&amp;nbsp; Contrary to this, in the Logic Test, these rules and conventions are tossed out the window and replaced with simpler rules instead.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;And if the rules &lt;b&gt;are&lt;/b&gt; simpler, they &lt;b&gt;should&lt;/b&gt; be easier to follow, right?&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Simple Ain't Always Easy&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Alas, like the kids in the “Head to Toes” game, developers find it difficult to ignore the “standard” rules.&amp;nbsp; As in the game, the test gives them 20 chances to do the correct-but-counter-intuitive thing. In this sense, then, the Logic Test serves the same purpose as the “Head to Toes” game in measuring the relative level of self-discipline a person has attained. The more self-disciplined a candidate is, the more successful s/he will be in resisting the temptation to do the comfortable thing and will instead follow the new rule.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The successful candidate will more likely than not be a person who can focus and adapt more quickly to attain a goal, even if s/he is uncomfortable while learning to use the "new tricks."&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Better than an IQ Test&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Tominey and other researchers have shown that self-regulation is a better predictor of success than IQ.&amp;nbsp; In a different experiment that measured impulsiveness, Walter Mischel of Stanford University followed up with the kids ten years after the original experiment and found that the less impulsive kids developed into “&lt;i&gt;self-motivating and organized adults who were good at coping with difficulties and persisted in the face of failure&lt;/i&gt;” while the others “&lt;i&gt;grew up to be easily distracted, less motivated and highly disorganized.&lt;/i&gt;”&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;In our terms, candidates who pass the Logic Test may or may not be the “genius” kids in the room, but they're likely to be the most accomplished because of perseverance and self-discipline.&amp;nbsp; They can focus on what's important and do what it takes to get it done. They don't get easily distracted by side issues (&lt;i&gt;e.g.&lt;/i&gt;, Java vs C# vs PHP vs ...) and find/learn/make/use the best tool for the job.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p class="general-quote" style="margin:0 45px 0 45px; text-align:justify;font-size:16px;"&gt;Outside the classroom, dieters who are able to resist that mouthwatering slice of cake quickly lose weight, students who endure the hardship of homework achieve better exam grades, and athletes who are prepared to spend hours training win more medals.&lt;br /&gt;― 59 Seconds: Thinking a Little, Change a Lot&lt;br /&gt;by Richard Wiseman&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;It Works on a Good Foundation&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The Nearsoft Logic Test is a valid instrument to use as part of our recruiting process.&amp;nbsp; It measures the level of self-discipline a candidate has developed.&amp;nbsp; And it helps us filter out people who would not be happy working at Nearsoft, where self-discipline is key to success.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/rq516RpNkS8" height="1" width="1"/&gt;</description>
			<author>Matt Perez</author>
			<pubDate>Sat, 27 Apr 2013 16:53:29 +0100</pubDate>
		<category>recruiting</category>
 <category>quality</category>
 <category>logic</category>
 <category>jobs</category>
 <category>culture</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/the-logic-behind-nearsofts-logic-test.html</feedburner:origLink></item>
		<item>
			<title>Mutate Your Code and Test Your Tests</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/z-BTZV8c1S0/mutate-your-code-and-test-your-tests.html</link>
			<description>&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;When 100% code coverage is not enough, there's Mutant.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;I have some crazy friends. One of them used to randomly delete lines from his code and run tests, just to see which ones turned "red."&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;"Some people just want to see the world burn"&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;When you think about it, the practice makes some sense.&amp;nbsp; Sometimes, we or our teammates end up adding buggy code that goes unnoticed simply because "the tests were green."&amp;nbsp; So, in addition to testing your code, you must also make sure that your tests are correct.&amp;nbsp; In other words, you should also "test your tests."&amp;nbsp;  The question is how to do this while meeting deadlines and having somewhat of a life.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/z-BTZV8c1S0" height="1" width="1"/&gt;</description>
			<author>Omar Vargas</author>
			<pubDate>Mon, 08 Apr 2013 17:33:00 +0100</pubDate>
		<feedburner:origLink>http://www.nearsoft.com/blog/mutate-your-code-and-test-your-tests.html</feedburner:origLink></item>
		<item>
			<title>The Pinnacle of Modern Science Fiction</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/0jVHrCzKk0w/the-pinnacle-of-modern-science-fiction.html</link>
			<description>&lt;p&gt;It's all about perspective.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;img src="http://farm9.staticflickr.com/8255/8619912547_d761a1b43e_z.jpg" mce_src="http://farm9.staticflickr.com/8255/8619912547_d761a1b43e_z.jpg" alt="Two nerds talking" title="The Pinnacle of Modern Science Fiction"&gt;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Enough said!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/0jVHrCzKk0w" height="1" width="1"/&gt;</description>
			<author>Axel Valdez</author>
			<pubDate>Thu, 04 Apr 2013 23:32:28 +0100</pubDate>
		<feedburner:origLink>http://www.nearsoft.com/blog/the-pinnacle-of-modern-science-fiction.html</feedburner:origLink></item>
		<item>
			<title>Real Programmers Do It in the Dark</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/-vE7YyItfBM/real-programmers-do-it-in-the-dark.html</link>
			<description>&lt;p&gt;What happens when you are in the middle of an interview and the power goes out?&amp;nbsp; Well, it depends …&lt;br /&gt;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The interview was in full swing when an accident outside the office took out a power pole.&amp;nbsp; The office went dark.&amp;nbsp; And when our office goes dark, it goes &lt;i&gt;really&lt;/i&gt; dark.&amp;nbsp; After a brief moment one of the interviewers took out his phone, shined it on the whiteboard, and the interview continued.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;That pretty much says it all about the culture at Nearsoft and the great people who make it what it is.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;img src="https://lh6.googleusercontent.com/-umdZnKDzBow/UVJzHKyWZrI/AAAAAAAAAaI/flDuuudWnps/s722/interview-in-the-dark.jpeg" mce_src="https://lh6.googleusercontent.com/-umdZnKDzBow/UVJzHKyWZrI/AAAAAAAAAaI/flDuuudWnps/s722/interview-in-the-dark.jpeg" alt="Whiteboarding during an interview in comoplete darkness" title="Real programmers do it in the dark!" height="525" width="700"&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/-vE7YyItfBM" height="1" width="1"/&gt;</description>
			<author>Matt Perez</author>
			<pubDate>Wed, 27 Mar 2013 03:37:45 +0100</pubDate>
		<category>programmers</category>
 <category>interviewing</category>
 <category>culture</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/real-programmers-do-it-in-the-dark.html</feedburner:origLink></item>
		<item>
			<title>"Do You Want to Grow Your Company?"</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/IGEntfrmFZ0/qdo-you-want-to-grow-your-companyq.html</link>
			<description>&lt;p&gt;It was a strange but valid question.&amp;nbsp; In my neck of the woods, we pretend it is a non-question.&amp;nbsp; But it is valid, and non-trivial.&amp;nbsp; Particularly if you also ask why?&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;How would you answer it?&amp;nbsp; The answer I gave surprised me :)&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The MBA student doing research for his thesis honestly wanted to know if we wanted to grow the company or keep the status quo.&amp;nbsp; We are forced to grow, I said, the company's noble cause requires that we do so.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;In order to &lt;i&gt;promote technology entrepreneurship&lt;/i&gt; to all corners of Mexico/Latin America/the World, we need to grow our footprint.&amp;nbsp; It may not result in traditional company growth but somehow we do have to grow the number of people who embrace failure and see it as an opportunity to learn, not something to forget as quickly as possible.&amp;nbsp; We have to get schools to assign "&lt;i&gt;Build an app to help people in Chiapas become more prosperous&lt;/i&gt;" as the class project and not "&lt;i&gt;Build a payroll application&lt;/i&gt;."&amp;nbsp; We have to spin off more technology businesses around us that aim to solve big, hairy, audacious problems, not just another flashlight app.&lt;/p&gt;&lt;p&gt;The yearning to try things out is there, hiding in plain sight.&amp;nbsp; Playfulness is abundant, and latent.&amp;nbsp; The culture of entrepreneurship is all around us, and mostly contained.&amp;nbsp; Our job is to start to take down the barriers that have been built up over a long period of success through conformity.&lt;br /&gt;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;"Not sure if we want to grow, but we have to."&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/IGEntfrmFZ0" height="1" width="1"/&gt;</description>
			<author>Matt Perez</author>
			<pubDate>Sat, 02 Feb 2013 11:54:51 +0100</pubDate>
		<category>workplace democracy</category>
 <category>workplace culture</category>
 <category>growth</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/qdo-you-want-to-grow-your-companyq.html</feedburner:origLink></item>
		<item>
			<title>After a Business Education, Entrepreneurs Are Making Their Mark in Schools</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/nYyGJsUCI2A/after-a-business-education-entrepreneurs-are-making-their-mark-in-schools.html</link>
			<description>&lt;p&gt;We have written earlier about a number of the most essential things startups must do to succeed, but tht was general advice, stuff that entrepreneurs from nearly any discipline could find useful.&amp;nbsp; This post, written by educational analyst Emma Collins, takes a look at education technology startups in particular.&amp;nbsp; Emma knows what she's talking about: she is the editor of the MBA Online Rankings of 2012 to offer tips and insight into this fast-growing marketplace.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://cdn4.openculture.com/wp-content/uploads/2010/04/bigstock_Online_Education_11092172.jpg" title="online education" alt="online education" height="200" width="300"&gt;&lt;p class="img-foot"&gt;Source: Open Culture&lt;/p&gt;&lt;p&gt;The education landscape has seen a lot of changes in recent years, both in terms of how schooling is administered and assessed and how technology is leveraged for learning. The rise of the Internet, both in popularity and ubiquity, has in many ways reshaped educational goals at all levels. Kindergarteners learn to compose stories and simple songs on iPads, for instance; graduate students often teach or participate in remote, online learning seminars. These and similar changes are, many scholars believe, just the tip of a larger digitization trend in modern learning. New innovations enter the market nearly every day. In many respects, the time has never been better to be an “edupreneur.”&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;It would be difficult today to go to a tech convention or small business association meeting and not meet anyone from the education sector. Things were not always this way, though. Ten years ago, the ed tech sector was just getting off the ground, and was often defined by the online degree programs pioneered by corporations like the University of Phoenix. These sorts of ventures were valuable to a certain niche of people—namely, those who were looking for a modern sort of correspondence program—but they also drew quite a lot of criticism, particularly where legitimacy and academic integrity were concerned. Nevertheless, they proved that the marriage of technology to education can be a viable one, which in turn opened the door to myriad innovations and new creations. As technology has improved and evolved, so have the ways in which it can be added to and used to enhance classroom learning at nearly all levels.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;“The original ‘concepts’ of e-learning have changed,” consulting firm Bersin &amp;amp; Associates has written on its education and training blog. “In the first few years companies rushed rapidly to take existing slides and instructor materials and put them online. Today's e-learning programs are very different than instructor led training: they act and behave like online movies, online video games, and immersive virtual experiences.”&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The rise of massive open online courses, or MOOCs, has been one of the most profound shifts. This style of teaching originates from many of the nation’s top universities—Harvard, the Massachusetts Institute of Technology, and Stanford among them—and is designed to provide knowledge and learning to the general public through the Internet. Courses are typically based on regular in-person lectures, but then are optimized for the online realm and opened up to literally thousands of students.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Even schools that do not participate in MOOC programming are increasingly shifting to more “blended” courses where the online space plays a prominent role. Yale is one of the most recent, deciding in early December 2012 to make online learning a part of every student’s experience. “Yale has this mission: the creation, preservation and dissemination of knowledge. This is dissemination,” Yale psychology professor Paul Bloom said in a press release. “We’re extremely excited for the use of digital initiatives to disseminate knowledge and we plan to move forward building upon the strengths we’ve already established.”&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Not all ed tech initiatives are so far reaching, and in most cases they don’t need to be in order to be effective. Take Chegg, for instance. Chegg began as a simple textbook rental business that used the Internet to connect students with the books they needed, when they needed them. It has since morphed into a full-service “academic hub” offering homework help, tips on course selection, and note-taking tutorials, among many other things.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Of course, the longevity of programs like Chegg and initiatives like MOOCs depends on several external factors. Funding is a big part of the equation, as is student and school adoption. In order to find success, edupreneurs often need more than just a good idea—though in today’s thirsty market, that idea is usually enough to at least get things started.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/nYyGJsUCI2A" height="1" width="1"/&gt;</description>
			<author>Emma Collins</author>
			<pubDate>Mon, 07 Jan 2013 20:36:50 +0100</pubDate>
		<category>startups</category>
 <category>MOOC</category>
 <category>entrepreneurship</category>
 <category>education</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/after-a-business-education-entrepreneurs-are-making-their-mark-in-schools.html</feedburner:origLink></item>
		<item>
			<title>Dev Team Communications 101</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/fQ5qTEyCJNI/dev-team-communications-101.html</link>
			<description>&lt;p&gt;It takes a while to learn to really communicate well.&amp;nbsp; In the meantime small mistakes can lead you to big problems. Here are six-plus basic tips and tricks that we have learned the hard way and that could help you.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://i36.photobucket.com/albums/e37/tigmata/Myspace-Graphics-Funny-019.jpg" mce_src="http://i36.photobucket.com/albums/e37/tigmata/Myspace-Graphics-Funny-019.jpg" alt="Fortune cookie says &amp;quot;THAT WASN'T CHICKEN&amp;quot; in front of the remains of a meal in the background" title="THAT WASN'T CHICKEN" width="300"&gt;&lt;p class="img-foot"&gt;Source: Photobucket&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Bad News First&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Don’t try to solve the problem by yourself before communicating it.&amp;nbsp; If there is something wrong, let your team know about it. Yes, it is hard and you might be trolled but is the right thing to do and you will get the help you need sooner rather than later.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Answer the Damn Question&lt;br/&gt;&lt;br/&gt;&lt;p&gt;When you are asked a question, answer it.&amp;nbsp; Don’t go into a long, verbose explanation of the whys and wherefores first.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Once you've responded to the specific question then follow it up with whatever clarification are needed.&amp;nbsp; But only if they are really needed!&amp;nbsp; Check with the other person and if there's no need for clarification or further explanation, then save each other some time.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Never Leave People in the Dark&lt;br/&gt;&lt;br/&gt;&lt;p&gt;How often do people have to ask you for status?&amp;nbsp; If they ask often, then you are obviously not providing enough information on a regular basis.&amp;nbsp; Or maybe you are not being clear enough.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Avoid Saying YES When You Really Mean NO!&lt;br/&gt;&lt;br/&gt;&lt;p&gt;After looking over a number of Stories, we estimated that it would take two weeks to implement them.&amp;nbsp; As we discussed this in our Sprint planning meeting, it turned out that some of the stakeholders were expecting them to get done in four days.&amp;nbsp; That was a big difference in expectations.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Instead of saying "yes," just to avoid a confrontation, we explained our assumptions and the rationale behind our estimates.&amp;nbsp; After much hemming and hawing, they went along with us.&amp;nbsp; In the end, we delivered on time, as per our estimate.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;That brought the team closer and the dev team gained the trust of the other stakeholders.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;You'll rarely regret saying no.&amp;nbsp; But you'll often wind up regretting saying yes.&amp;nbsp; Saying no may lead you into confrontation and will make you feel uncomfortable for a bit. But the alternative is even worse.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;No too many options here: if you can’t do the work, then your answer is no.&amp;nbsp; Better to under promise and over deliver.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;It Can’t Wait&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If it can't wait, and you can deliver, then do so, on time.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If it can't wait, but you can't deliver, then say so right away.&amp;nbsp; Your speaking up about it can't wait!&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;There are lots of thing that can't wait or else they'll become a big problem, for example, blocking issues, questions, suggestions, notice of days off, etc.&lt;br /&gt;Read Your Emails&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;In an earlier project, I noticed an email that needed a quick response from another fellow in the team.&amp;nbsp; It was addressed to him, but several others, including myself, were copied.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;When I asked him about it, it turned out that he had more than 50 unread emails that he had not responded to.&amp;nbsp; As he explained, “I read the subject line and I didn't think they were directed at me, so I didn't read them.”&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;No matter the subject line, you need to read emails sent to you.&amp;nbsp; If it makes sense, asked to be taken off the Cc: list.&amp;nbsp; Otherwise, answer the emails, even if it is to say "I don't know."&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Other Tips&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  Be honest.&amp;nbsp; When you find yourself tempted to agree, express your true opinion, even if it hurts (temporarily).&lt;br/&gt;  Be clear.&amp;nbsp; When you are sending an email, read it before sending it.&amp;nbsp;&amp;nbsp; If it’s too long, make it shorter.&amp;nbsp; And then shorten it some more.&amp;nbsp; If that's not possible, then put it in a document and send that instead.&lt;br/&gt;  More often than not, people hear and perceive things differently.&amp;nbsp; Always ask, “did I explain this clearly?”&lt;br/&gt;  "ASAP" is a four-letter word, it doesn't mean anything.&amp;nbsp; What's as soon as possible for you is always different than what it means to somebody else.&amp;nbsp; They are focusing on "soon" and you on "possible."&amp;nbsp; Be specific as to when you need something or when you can deliver something.&lt;br/&gt;  Follow your phone conversations with an email summary, especially when important decisions have been made. “As we discussed in our call, we agreed to …”&lt;br /&gt;If you don’t understand something, don’t say OK.&amp;nbsp; Ask. “Can you repeat that, please? I didn’t get it.”&lt;br/&gt;  If somebody claims something you know is not right, clarify right away.&amp;nbsp; Don't let the other folks walk away with the wrong idea or belief.&lt;br/&gt;  Don't hide behind email when you have a problem.&amp;nbsp; Get off you butt and talk to or call your teammates and let them know what's up.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Why Bother?&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Because, poor communications on your part inevitably will,&lt;br /&gt;Make your team uncomfortable and inefficient&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Give your team a negative perception of you (and "fixing"&amp;nbsp; that will take a lot of effort)&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Make people around you not want to work with you.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/fQ5qTEyCJNI" height="1" width="1"/&gt;</description>
			<author>Julio Gonzalez</author>
			<pubDate>Tue, 27 Nov 2012 16:44:46 +0100</pubDate>
		<category>teamwork</category>
 <category>culture</category>
 <category>communications</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/dev-team-communications-101.html</feedburner:origLink></item>
		<item>
			<title>iOS: How to Change the UINavigationBar Background Image</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/gcViNCaszhM/ios-how-to-change-the-uinavigationbar-background-image2.html</link>
			<description>&lt;p&gt;Since iOS 5, you can to use the following code, to change the background in the navigationBar using an image.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Here's the sample code,&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p style="font-family: Courier New; font-size: smaller;"&gt;&lt;br/&gt;[myNavbar setBackgroundImage:[UIImage imageNamed: @"UINavigationBarBackground.png"]&lt;br /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; forBarMetrics:UIBarMetricsDefault];&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Now, if you want to apply the background to all your navbar in your app, uses the following line in the appdelegate, instead of repeating the previous one inside each controller:&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p style="font-family: Courier New; font-size: smaller;"&gt;&lt;br/&gt;[[UINavigationBarappearance]&lt;br /&gt;&lt;br/&gt;setBackgroundImage:[UIImageimageNamed:@"UINavigationBarBackground.png"]&lt;br /&gt;&lt;br/&gt;forBarMetrics:UIBarMetricsDefault];&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/gcViNCaszhM" height="1" width="1"/&gt;</description>
			<author>Jesus Guerra</author>
			<pubDate>Wed, 31 Oct 2012 19:59:59 +0100</pubDate>
		<category>iOS</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/ios-how-to-change-the-uinavigationbar-background-image2.html</feedburner:origLink></item>
		<item>
			<title>iOS: How to Navigate UITextfields with Next/Done Buttons</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/TUaxnwG-Ph8/ios-how-to-navigate-uitextfields-with-nextdone-buttons2.html</link>
			<description>&lt;p&gt;Navigating UITextfields with Next/Done buttons is pretty simple.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;In order to do this, first you need to do the following steps:&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;First you need to set the delegate for each UITextField un you xib to your controller.You need to define the "tab-order" by setting the tag property for each UITextField&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Then implement the following code in you .m controller,&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p style="font-family: Courier New; font-size: smaller;"&gt;&lt;br/&gt;-(BOOL)textFieldShouldReturn:(UITextField*)textField;&lt;br /&gt;&lt;br/&gt;{&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp; NSInteger nextTag = textField.tag + 1;&lt;br /&gt;&lt;br/&gt;&amp;nbsp; // Try to find next responder&lt;br /&gt;&lt;br/&gt;&amp;nbsp; UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];&lt;br /&gt;&lt;br/&gt;&amp;nbsp; if (nextResponder) {&lt;br /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Was found , so move to next textField.&lt;br /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [nextResponder becomeFirstResponder];&lt;br /&gt;&lt;br/&gt;&amp;nbsp; } else {&lt;br /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wasn't found, so dismiss keyboard.&lt;br /&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [textField resignFirstResponder];&lt;br /&gt;&lt;br/&gt;&amp;nbsp; }&lt;br /&gt;&lt;br/&gt;&amp;nbsp; return NO; // We do not want UITextField to insert line-breaks.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/TUaxnwG-Ph8" height="1" width="1"/&gt;</description>
			<author>Jesus Guerra</author>
			<pubDate>Wed, 31 Oct 2012 19:56:55 +0100</pubDate>
		<category>programming</category>
 <category>iOS</category>
 <category>code</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/ios-how-to-navigate-uitextfields-with-nextdone-buttons2.html</feedburner:origLink></item>
		<item>
			<title>Recruiting Is Such a Pain</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/C_P7l52WMKg/recruiting-is-such-a-pain.html</link>
			<description>&lt;p&gt;Get those new features out.&amp;nbsp; And fix those bugs, too.&amp;nbsp; Hire more people if you need to.&amp;nbsp; But keep your budget in check.  Have you looked at outsourcing, yet?&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If this sounds familiar to you, read this post.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;img mce_src="http://food-hub.org/news/wp-content/uploads/2010/01/needle_in_the_haystack.jpg" title="Finding the needle in a haystack" alt="Haystack with needle in it" height="307" width="300" src="http://food-hub.org/news/wp-content/uploads/2010/01/needle_in_the_haystack.jpg"&gt;&lt;p style="font-family: Helvetica, Arial, sans-serif; font-size: 11px;"&gt;Source: Food Hub&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;And just how are you supposed to do all that without putting your software at risk and demoralizing your team in the process?&amp;nbsp; How are you going to find quality developers in the current climate?&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Writing software is not like making widgets.&amp;nbsp; Developing great software is hard, even when developers are sitting next to each other.&amp;nbsp; "Cheap" has a high cost. &lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Offshore&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Your best people will be the first to get frustrated by having to handhold and clean up after the not-so-great-but-cheap folks.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;You've put a lot of care in creating your software, and you don't want just anybody to come in and to mess it up for you.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Hire More Here Then&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Recruiting is a pain.&amp;nbsp; Recruiters' fees are at an all-time high and all they can really do for you is to send you resumes.&amp;nbsp; You and your team still have to do all the heavy lifting after that.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt; It takes a lot of my developers' time.&amp;nbsp; Worse, my folks are tired of interviewing so many clueless people.&lt;br/&gt;&lt;br/&gt;Work with Nearsoft&lt;br/&gt;&lt;br/&gt;&lt;p&gt;We do it all the time.&amp;nbsp; And we've gotten very good at it.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;We don't throw resumes at you.&amp;nbsp; We do all the heavy lifting to make sure that we hire the good ones, the ones who care.&amp;nbsp; We have to.&amp;nbsp; Because otherwise your team will chew them up and spit them out.&amp;nbsp; So we have to find the ones that your team will want to work with. &lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;And we do.&amp;nbsp; Just ask any of our clients. &lt;/p&gt;&lt;br/&gt;&lt;br/&gt;What's Next?&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Grow your team.&amp;nbsp; Make your CEO happy.&amp;nbsp; Check off the "outsourcing" box.&amp;nbsp; Make your CFO happy.&amp;nbsp; Take the subject off the list,&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;We found a solution that even our developers are happy with.&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/C_P7l52WMKg" height="1" width="1"/&gt;</description>
			<author>Matt Perez</author>
			<pubDate>Fri, 24 Aug 2012 00:04:18 +0100</pubDate>
		<category>recruiting</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/recruiting-is-such-a-pain.html</feedburner:origLink></item>
		<item>
			<title>Nearsoft's Illustrated New Employee Handbook</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/7Va6177qfrU/nearsofts-illustrated-new-employee-handbook.html</link>
			<description>&lt;p&gt;And without further ado, here is Nearsoft's illustrated New Employee Handbook.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;And while you're waiting for the download to finish, here's a preview.&amp;nbsp; This is an updated version (with less bugs, we hope).&amp;nbsp; As always, f you find typos, etc., please let us know below, in the comments section.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/0-Cover-01.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/0-Cover-01.png" title="Cover" alt="Cover" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/1-TOC_TOC.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/1-TOC_TOC.png" title="Table of Contents" alt="Table of Contents" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_01-Welcome.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_01-Welcome.png" title="Welcome" alt="Welcome" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_02-Essentials.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_02-Essentials.png" title="Essentials" alt="Essentials" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_03-Meet-Everyone.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_03-Meet-Everyone.png" title="Meet Everyone" alt="Meet Everyone" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_04-Choose-Your-Place.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_04-Choose-Your-Place.png" title="Choose Your Place" alt="Choose Your Place" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_05-Equipment-and-Tools.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_05-Equipment-and-Tools.png" title="Get Your Equipment and Tools" alt="Get Your Equipment and Tools" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_06-Schedule-Your-Orientation-Classes.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_06-Schedule-Your-Orientation-Classes.png" title="Schedule Your Orientation Classes" alt="Schedule Your Orientation Classes" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_07-And-Your-Mentor-Is.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_07-And-Your-Mentor-Is.png" title="And Your Mentor Is … ?" alt="And Your Mentor Is … ?" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_08-Your-First-Week.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_08-Your-First-Week.png" title="Your First Week" alt="Your First Week" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_09-And-What-About-Our-Tribe.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_09-And-What-About-Our-Tribe.png" title="And What About Our Tribe?" alt="And What About Our Tribe?" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_10-Rules-to-Live-By.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/2-HB_10-Rules-to-Live-By.png" title="Rules to Live by" alt="Rules to Live by" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/3-HB_11-Your-Career-at-Nearsoft.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/3-HB_11-Your-Career-at-Nearsoft.png" title="Your Career at Nearsoft" alt="Your Career at Nearsoft" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/3-HB_12-Advancement-vs-Development.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/3-HB_12-Advancement-vs-Development.png" title="Advancement vs Development" alt="Advancement vs Development" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/3-HB_13-More-Rules-to-Live-By.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/3-HB_13-More-Rules-to-Live-By.png" title="More Rules to Live by" alt="More Rules to Live by" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/3-HB_14-Internal-Regulations.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/3-HB_14-Internal-Regulations.png" title="Internal Regulations" alt="Internal Regulations" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/3-HB_15-Other-Rules-to-Live-By.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/3-HB_15-Other-Rules-to-Live-By.png" title="Other Rules to Live By" alt="Other Rules to Live By" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/3-HB_16-Empowerment-Nearsoft-Style.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/3-HB_16-Empowerment-Nearsoft-Style.png" title="Empowerment, Nearsoft Style" alt="Empowerment, Nearsoft Style" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_17-Company-Culture.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_17-Company-Culture.png" title="Company Culture" alt="Company Culture" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_18-Value-Commitment.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_18-Value-Commitment.png" title="Value: Commitment" alt="Value: Commitment" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_19-Value-Leadership.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_19-Value-Leadership.png" title="Value: Leadership" alt="Value: Leadership" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_20-Value-Long-Term-Relationship.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_20-Value-Long-Term-Relationship.png" title="Value: Long-term Relationships" alt="Value: Long-term Relationships" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_21-Value-Be-Smart-Get-Things-Done.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_21-Value-Be-Smart-Get-Things-Done.png" title="Value: Be Smart and Get Things Done" alt="Value: Be Smart and Get Things Done" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_22-Value-Teamwork.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_22-Value-Teamwork.png" title="Value: Teamwork" alt="Value: Teamwork" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_23-Yet-More-Rules-to-Live-By.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_23-Yet-More-Rules-to-Live-By.png" title="Yet More Rules to Live by" alt="Yet More Rules to Live by" width="300"&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_24-And-Finally.png" mce_src="http://www.nearsoft.com/images/stories/nearsoft/blog/NewEmpHandbook/pages/4-HB_24-And-Finally.png" title="And Finally …" alt="And Finally …" width="300"&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/7Va6177qfrU" height="1" width="1"/&gt;</description>
			<author>Matt Perez</author>
			<pubDate>Sun, 05 Aug 2012 08:25:38 +0100</pubDate>
		<category>workplace democracy</category>
 <category>new employee handbook</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/nearsofts-illustrated-new-employee-handbook.html</feedburner:origLink></item>
		<item>
			<title>Presence: Being There Even When You Are Not</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/IFj9ghztm_E/presence-being-there-even-when-you-are-not.html</link>
			<description>&lt;p&gt;Staying present when working remotely takes work, it doesn't come for free as when you are co-located with the rest of your team.&amp;nbsp; This is quick summary of what we've learned to be &lt;i&gt;there&lt;/i&gt; for you team even when you are not physically there with them.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;This was an internal document but we felt it was worth sharing it with others who may be in a similar situation.&amp;nbsp; The text is aimed at a person working in our Hermosillo office, but the tips and techniques will still apply if you replace it with your location.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Time Alignment&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.cartoonstock.com/newscartoons/cartoonists/mbc/lowres/mbcn326l.jpg" title="Being There, at the Other End of the Line" mce_src="http://www.cartoonstock.com/newscartoons/cartoonists/mbc/lowres/mbcn326l.jpg" alt="Two kids talking on a can+string phone while standing next to each other" height="400" width="400"&gt;&lt;p style="font-family: Helvetica, Arial, sans-serif; font-size: 11px;"&gt;Artist: Marty Bucella. Source: The Cartoonstock Directory&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;One of the key business advantages Nearsoft has is the fact that we are aligned in time with our clients.&amp;nbsp; The fact that we can work side-by-side with our clients gives us a great edge.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;However, we have to put some effort in order to make this physical and time proximity work for us and our clients.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Where Are You Guys?&lt;br/&gt;&lt;br/&gt;&lt;p&gt;When people work physically together in an office, everyone "just knows" when others are "around" and available to them. &amp;nbsp;Their physical presence is enough to communicate this. &amp;nbsp;When people work remotely, it is not obvious when they are around or if they are there at all.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;When you walk into our Hermosillo office, it is not obvious to you if your teammates in the US are really "there" and available to you. &amp;nbsp;As far as you're concerned, they are not present.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Maybe they are taking the day off. &amp;nbsp;Or maybe they went off to celebrate somebody's birthday (and you didn't hear about it because the conversation happened offline, in the lobby of their building in San Francisco).&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The exact same thing happens at the other end. &amp;nbsp;You are not present to your US teammates by default. &amp;nbsp;Showing up to the office is not enough to create that presence. &amp;nbsp;People on both sides need to do more to make themselves present.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Doing More&lt;br/&gt;&lt;br/&gt;&lt;p&gt;So, what can &lt;i&gt;you&lt;/i&gt; do to make yourself present?&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p style="font-family: Helvetica, Arial, sans-serif; font-size: 11px;"&gt;Note: throughout this doc, "Skype" really stands for "whatever your team uses to connect online."&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Log in and Stay Logged In&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If you are not logged in to Skype then you are not there. &amp;nbsp;This is true for your remote team. &amp;nbsp;But it is true even for people in your office.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;p&gt;[7/31/12 10:16:02 AM] Matt: Can we go over the proposal now?&lt;/p&gt;&lt;br/&gt;  &lt;p&gt;[7/31/12 10:17:32 AM] Julio: No, I don't see Mary online&lt;/p&gt;&lt;br/&gt;  &lt;p&gt;[7/31/12 10:17:40 AM] Julio: Oh, wait, I see her at his desk :)&lt;/p&gt;&lt;br/&gt;  &lt;p&gt;[7/31/12 10:17:49 AM] Julio: I'll ask her to log in&lt;/p&gt;&lt;br/&gt;  &lt;p&gt;[7/31/12 10:17:52 AM] Matt: $@#)(*&amp;amp;&lt;/p&gt;&lt;br/&gt;  &lt;p&gt;… 10 minutes later …&lt;/p&gt;&lt;br/&gt;  &lt;p&gt;[7/31/12 10:27:03 AM] Mary: I am ready!&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If you can't be found, people will go about their business without you.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Log in and stay logged in. &amp;nbsp;Be present.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Lurkers Are Invisible&lt;br/&gt;&lt;br/&gt;&lt;p&gt;To remain present in a group chat (text or voice), you must participate and not just lurk. &amp;nbsp;If you haven't posted or said something for a few &lt;i&gt;seconds&lt;/i&gt;, you are forgotten (at least, temporarily).&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;This is also true even in meetings where everybody is physically present. &amp;nbsp;The quiet people who never say anything, are … not there! &amp;nbsp;It is not surprising to hear, "Oh, was such-and-such at the meeting?" or "I am not sure if she was at the meeting … was she?"&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;It takes time for the human brain to build a memory, even a short-term memory. &amp;nbsp;It is easier to establish a memory if the stimulus is extended in time and/or has a high emotional component. &amp;nbsp;That's why it is easier to remember the loud-mouth-who-won't-stop talking types and to sometimes forget the quiet, soft-spoken people in the room.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;This is not an invitation for you to become a loud-mouth-won't-stop-talking kind of person. &amp;nbsp;The point is to strike a balance so other people in the (virtual) room note and remember your presence.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Don't Mess with the Skype Status&lt;br/&gt;&lt;br/&gt;&lt;p&gt;When you are logged in to Skype, it keeps track of whether you are Online or Away (after a few minutes of inactivity). &amp;nbsp;So, don't mess with it. &amp;nbsp;You won't remember to put it back and you will forever show up as &lt;i&gt;Away&lt;/i&gt;, or worse, you'll set it to &lt;i&gt;Invisible&lt;/i&gt; and you won't show up at all.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Some people insist on setting their status to Do Not Disturb because it prevents Skype from making noises when somebody posts on some group chat. &amp;nbsp;That's understandable. &amp;nbsp;But then, you have to remember to put it back to Online or else, you will appear as Do Not Disturb forever on after.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;It is really annoying and counterproductive to keep waiting for somebody because their status is Away or Do Not Disturb only to find out that they were "there" all the time.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;p&gt;[5/31/12 11:36:46 AM] Hugo: ok, let's wait for Mary. She's not online.&lt;/p&gt;&lt;br/&gt;  &lt;p&gt;[5/31/12 11:36:48 AM] Mary: I am here!&lt;/p&gt;&lt;br/&gt;  &lt;p&gt;[5/31/12 11:37:02 AM] Matt: $@#)(*&amp;amp;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If you really don't want to be interrupted, then log out of Skype. &amp;nbsp;Leave the building. &amp;nbsp;Get away. Otherwise, make yourself present.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Low Latency (Chat)&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The ideal is to respond immediately to a post directed at you or a question that you can answer. &amp;nbsp;Obviously, it is impossible to do this all the time. &amp;nbsp;But if you do it often enough, and people in your team think of you as responsive, then you've accomplished the ultimate goal because they will reach out to you when they need a quick response.&amp;nbsp; You are "there" for them.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Low Latency (Email)&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Respond to emails right away. &amp;nbsp;If you respond to an email as soon as you receive it, the quick response will make it clear to all recipients that "she is there now."&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Even if it is to say, "got your email, will respond in detail later," the quick response will make you present in the mind of the sender.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;I suspect that a purist would say that "email is an asynchronous communication medium and not for this sort of thing." &amp;nbsp;And she'd be technically correct. &amp;nbsp;And invisible.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Ask and You Shall Be Present&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If you have a question, ask. &amp;nbsp;Preferably in a group chat, where anybody can jump in and help you. And everybody &lt;i&gt;sees&lt;/i&gt; you.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If you hear the-little-voice-in-your-head saying, "that's a stupid question," ignore it. &amp;nbsp;In fact, turn it to your advantage and treat it as an indication that it is time to do the opposite: ask and ask "in public."&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;It is preferable to be present than to try to not "look bad" by not asking and getting stuck or, worse, end up reinventing the wheel.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Yes, there's the people at the other extreme who constantly ask the most inane questions. "Do chickens have lips?" &amp;nbsp;You don't want to be at that end of the spectrum, either.&amp;nbsp; The key is to strike a balance. &amp;nbsp;But for the most part, technical folks tend to "try to figure it out myself." Unfortunately, while you are figuring things out, and not interacting with your team, you are practically invisible.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;p&gt;[8/03/12 04:02:33 PM] Isaac: Is Mary OK? &amp;nbsp;I haven't heard from her in a while&lt;/p&gt;&lt;br/&gt;  &lt;p&gt;[8/03/12 04:03:13 PM] Paul: She's probably stuck and trying to reinvent the wheel by herself&lt;/p&gt;&lt;br/&gt;  &lt;p&gt;[8/03/12 04:03:15 PM] Paul: She does that sometimes :(&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;So, not only are you invisible but you are not looking so good, either.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Where Do You Live?&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Our bodies, brains included, are wired to react to threats by pulling away from the source of the threat. &amp;nbsp;the-little-voice-in-your-head is there to warn you about threats.&amp;nbsp; This is generally a good thing.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Where things get messed up is when we perceive that taking a particular action will be damaging to us. &amp;nbsp;As in "asking a stupid question." &amp;nbsp;This would make you look stupid. &amp;nbsp;And you don't want to be the stupid person in your tribe. &amp;nbsp;The others would shun you and leave you behind to die in the forest.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;So the-little-voice-in-your-head is a good thing if you live among people who are known to leave members behind to die in the forest when they ask stupid questions. &amp;nbsp;BUT THAT IS NOT WHERE YOU LIVE. &amp;nbsp;It's just that our bodies don't quite know this and we still behave as if we were battling it out in the plains of pre-historic Africa (or in High School).&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The general culture doesn't help, either, and as kids we are encouraged to "be quiet." &amp;nbsp;Or we are even told "don't ask stupid questions."&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;It is up to you, as a responsible adult, to consciously reframe participation in your mind as a "good" thing and not a "risk." &amp;nbsp;The benefit of asking the darn question far outweighs any imagined "risk." &amp;nbsp;By asking and fully participating, you'll be present to your team. &amp;nbsp;And you might actually learn something.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;This is a long way of saying that the only truly stupid question (and the one that makes you invisible) is the question not asked.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Keep a Predictable Schedule&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If you always start to work at around 10 am, then people will learn that you'll be there for them starting at 10 am. &amp;nbsp;On the other hand, if there's no way to know when you are going to be "there," then people won't know when they can count on you.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Having predictable hours adds to your being present for your team. &amp;nbsp;This is true for you local teammates, but it is essential for your remote teammates.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;It is also important that your teammates know when you are &lt;i&gt;not&lt;/i&gt; available. &amp;nbsp;As in, when you take off for lunch.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The more predictable you can make your day, the easier it will be for your teammates to learn, implicitly, when they can expect you to be there for them and when you won't,&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;p&gt;[8/04/12 01:12:03 PM] Isaac: I am looking for Mary but she is "away"&lt;/p&gt;&lt;br/&gt;  &lt;p&gt;[8/04/12 01:12:08 PM] Paul: It's after 1 pm and she's probably at lunch&lt;/p&gt;&lt;br/&gt;  &lt;p&gt;[8/04/12 01:12:09 PM] Paul: She eats late&lt;/p&gt;&lt;br/&gt;  &lt;p&gt;[8/04/12 01:12:11 PM] Paul: Look for her again at around 2 pm, she'll be there for sure&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Long-Term Presence, One Way&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Beyond being present online, you can make yourself present to your teammates for the long-term by sharing your story with them.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;We all have a story of who we are, our family, our friends, circumstances, likes, dislikes. &amp;nbsp;The more of this story you let out, the higher that the emotional "resolution" of your connection to your teammate will be.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Of course, the-little-voice-in-your-head will mess with you in this case, too. &amp;nbsp;"Why would she care?" says the-little-voice-in-your-head, why would anybody care what happened to you in third grade or when you lived in Finland or … you get the point.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;As always, the-little-voice-in-your-head is trying to "protect" you from making yourself vulnerable. What if she recoils from you once she gets to really know you? &amp;nbsp;or worse, what if she makes fun of your story?&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;What the overprotective little-voice-in-your-head doesn't know is that in this day and age what's worse than all that is for two people to work with each other for days, weeks, or years and not know anything about each other.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Long-Term Presence, the Other Way&lt;br/&gt;&lt;br/&gt;&lt;p&gt;By the same token, find out more about your teammates. &amp;nbsp;What's their story? &amp;nbsp;Does she have brothers or sisters? &amp;nbsp;Where is she originally from? &amp;nbsp;Why did she get into this racket? &amp;nbsp;What are her passions?&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;As far as the-little-voice-in-your-head is concerned, this is being noisy. &amp;nbsp;"That's none of your business." &amp;nbsp;Say "thanks" to the-little-voice-in-your-head and ask away.&amp;nbsp; Get to learn all you can about the people you spend most of your day "next" to, even the ones who are thousands of miles away.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Use "Like"&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Writing and replying to posts is great to make yourself present.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;You can also "Like" posts as a very quick way to let your teammates know that you've read their post, and that they are present to you.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If your team does not use Yammer or some other "virtual water cooler," then start an account and invite everybody in your team to it.&amp;nbsp; A community needs a hangout, and a distributed community needs a virtual hangout.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Blog Posts, Videos, Artwork&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Let your teammates know when you publish a blog post.&amp;nbsp; Or upload a &lt;br/&gt;video or artwork that you made.&amp;nbsp; These show them another angle of who &lt;br/&gt;you are. &amp;nbsp;They add depth to their perception of you as a whole person. &lt;br/&gt;&amp;nbsp;And it contributes to your long-term presence with the team &lt;br/&gt;(I wonder what the-little-voice-in-your-head would say, "don't be a show off" :)&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Would these Work on You?&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If a teammate of yours followed these practices, would it make it easier for you to feel her presence more readily?&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If you knew about her family, the funny thing that happened to her in&lt;br/&gt; third grade, and the fact that she is nuts about motorcycle racing, &lt;br/&gt;would this make her more present, more real to you?&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If you know that she is always there at certain times of the day, and&lt;br/&gt; she's pretty responsive, would you feel that she is somebody you can &lt;br/&gt;count on? &amp;nbsp;somebody who's &lt;i&gt;there for you&lt;/i&gt; even if not at this very moment?&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;What Else Could We Do?&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Obviously, this list is not a complete list of all the possible things you could do to be present for your teammates.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;What else do you already do along these lines? &amp;nbsp;Do you have tips or &lt;br/&gt;advice that the rest of us can use to make ourselves present?&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Please, add those here, in the comments below (and make yourself present to us, the readers :).&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Related Posts&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  Yammer, Skype and Remote "Presence"&lt;br/&gt;  The Ever-Learning Tribe&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/IFj9ghztm_E" height="1" width="1"/&gt;</description>
			<author>Matt Perez</author>
			<pubDate>Sat, 04 Aug 2012 22:27:52 +0100</pubDate>
		<category>Yammer</category>
 <category>skype</category>
 <category>remote presence</category>
 <category>communications</category>
 <category>collaboraion</category>
 <category>chat</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/presence-being-there-even-when-you-are-not.html</feedburner:origLink></item>
		<item>
			<title>Dignity: More Important than Ergonomic Chairs</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/Ux64I5bG_uQ/dignity-at-nearsoft.html</link>
			<description>&lt;p&gt;Great work, good money, and time to play with the kids (or friends, or &lt;br/&gt;your band, etc).&amp;nbsp; These things are important at a personal level.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;And so is dignity.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;We need to work at it to preserve it.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;This is a slightly edited version of an internal document.&amp;nbsp; We wanted to share it to illustrate another aspect of our culture and to encourage others to take an explicit stand on dignity@work. &lt;/p&gt;That's Stupid!&lt;br/&gt;&lt;br/&gt;&lt;img src="http://www.childwisechat.com/wp-content/uploads/2011/02/surrender-with-dignity1.jpg" mce_src="http://www.childwisechat.com/wp-content/uploads/2011/02/surrender-with-dignity1.jpg" alt="Mom pulling on child that's holding on to door frame" title="Surrender with Dignity" height="206" width="300"&gt;&lt;p style="font-family: Helvetica, Arial, sans-serif; font-size: 10px;"&gt;Source: Childwise Chat&lt;/p&gt;&lt;p&gt;If anybody in the team, including "los del otro lado," wants us to do something "stupid," we push back.&amp;nbsp; We don't just say "OK" and then "try" our best.&amp;nbsp; We point out that "this is not going to work" or "there are easier ways to do this, if we change it a bit" or whatever.&amp;nbsp; We don't just acquiesce to "not make waves."&amp;nbsp; That's only an excuse for not taking a stand.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Try not. Do or do not. There is no try — Yoda&lt;br/&gt;&lt;br/&gt;&lt;p&gt;"Trying" knowing that it is not going to work robs you of your dignity.&amp;nbsp; You are not going to feel very good about "trying" by the end of the day.&amp;nbsp;&amp;nbsp; In the end no value is created for you, your team, or the client.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;"I could have told'em it wasn't going to work."&amp;nbsp; Those are the words of a broken spirit trying to push away the pain and shame of having given up from the start.&amp;nbsp; If there's something to be said, say it.&amp;nbsp; You'll feel much better about it and will create more value for everybody involved.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Commitment to success requires you to push back on "stupid" requirements from the get go.&amp;nbsp; It means pulling the team back from taking the wrong path even if it means a fight.&amp;nbsp; Better to fight the good fight now, when there is still a chance of avoiding the problems you foresee.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;For our business, pushing back is money in the bank, so to speak.&amp;nbsp; It differentiates us from the countless body shops out there that sell obedience at cheap rates.&amp;nbsp; "Push back" and contribution beyond "cranking out code" is why our clients choose to work with us instead of going to body shops in far away places.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;We all put a lot of effort into hiring people who can contribute beyond their technical skills.&amp;nbsp; The fact that you are reading this is proof that you can do more than mere techie stuff.&amp;nbsp; Our clients value and expect your full contribution—they expect you to lead.&amp;nbsp; "We need people who can push back and gives us alternatives if we are asking for the wrong things."&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;It Must Be My English &lt;br/&gt;&lt;br/&gt;&lt;p&gt;If a request is not clear, ask for clarification.&amp;nbsp; And keep asking until you are certain that you understand what's required and why.&amp;nbsp; "This is what I want you to do" is only half a request.&amp;nbsp; We are professionals, we need to understand more than the what of a request.&amp;nbsp; We need to know &lt;i&gt;why&lt;/i&gt;.&amp;nbsp; And you won't find out unless you ask.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If anybody is upset by your questions, then better to upset her now than when you deliver the wrong thing later.&amp;nbsp;&amp;nbsp; Because you didn't ask.&amp;nbsp; Because you didn't insist&amp;nbsp; on understanding the what, when, and why of the request.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The smart thing to do is to learn to ignore the little voice in your head that says, "oh, it must be my English–I'll ask the others later."&amp;nbsp; If you don't understand something, it doesn't matter why.&amp;nbsp; Even if it is because of your English, it is still your responsibility to get to the bottom of it.&amp;nbsp; Otherwise you are going to get the wrong thing done.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Don't worry, if it really is your English and everybody else in the room does know, they'll let you know.&amp;nbsp; And they'll do it in no uncertain way.&amp;nbsp; "Yes, we understand what's needed here, we'll explain it in a bit."&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;What happens most often is that everybody in the team is listening to the same "voice" in their heads and at the end of the discussion nobody can explain the requirements. &lt;br /&gt;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;"I think she meant to say …" or "I didn't get that part, but I think …"&amp;nbsp; Don't put yourself in this situation, ask on the spot or call back and ask for clarification.&amp;nbsp; You are responsible for knowing, not guessing.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Better Not to Say Anything&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If anybody behaves unprofessionally, we push back and deal with it on the spot.&amp;nbsp; "Better not to say anything" is the worst thing you can do, for yourself for your team, and for the client.&amp;nbsp; Object to it on the spot and if need be, escalate it, too.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If anybody in the team, particularly any "authority" on the client side, ever "yells" at you or any of your teammates, calmly ask them to lower their voice and behave reasonably.&amp;nbsp; Don't drop down to their level and start yelling yourself, but don't let them get away with that kind of behavior.&amp;nbsp; Deal with it on the spot and escalate as necessary.&amp;nbsp;&amp;nbsp; Ditto for foul language.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;This Should Take &lt;i&gt;You&lt;/i&gt; Three Days to Complete&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If anybody tells you how long it is going to take you to do something, push back.&amp;nbsp; Make your own estimates and explain why it is going to take you however long you estimate that is going to take you.&amp;nbsp; If the person pushes back with, "well I can do it in half the time," then they should do it.&amp;nbsp; It'd be more efficient all around, right?&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;I Didn't Say Anything Not to Lose the Client&lt;br/&gt;&lt;br/&gt;&lt;p&gt;That is not a good reason for giving up your dignity.&amp;nbsp; Actually, that is not a good reason for anything. As a company we are ready to fire a client if they don't know how to or refuse to behave professionally.&amp;nbsp; We have done so in the past and we'll do it again if need be.&amp;nbsp; If our only value is to take abuse from a client, then that's not a client we want to work with.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;We are "the marrying kind" and cherish all our long-term relationship.&amp;nbsp; But they have to be good relationships.&amp;nbsp; It has to work for everybody in a healthy way, not a sadomasochistic way.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;The Client Told Me to Work this Weekend&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Or work all night.&amp;nbsp; Or cancel my vacation.&amp;nbsp; Whatever.&amp;nbsp; These are out of line and it is inappropriate for the client or anybody else to tell you to do any of these things.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;We've had teams that have signed up to work in shifts around the clock at the time of a major (major) release of their product.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Other times, people have rushed to the office during the weekend to take care of a problem that rendered their product inoperable.&amp;nbsp; Even though they didn't create the problem.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;In many cases, people have work long hours to clean up their own messes.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;All of these are different than having somebody &lt;i&gt;telling you&lt;/i&gt; to do one thing or another simply because they say so, end of discussion.&amp;nbsp; This situation is very likely a sign of a broken relationship.&amp;nbsp; So let's try to fix the real problem, but not by simply by going along "to not make waves."&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Just like anybody else, sometimes clients get themselves in a pickle, panic, and overreact.&amp;nbsp; You'll know when this is the case since you've been working with this person day in and day out for a while.&amp;nbsp; In this case, the best you can do is to help the client calm down, consider all the options, and arrive at a temporary fix or some other solution to the situation.&amp;nbsp; It may even involve working over the weekend, if that's what you both decide.&lt;/p&gt;&lt;p&gt;And that's the key: a consensual decision given the facts, rather than one person making unreasonable demands of another.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Our Team, Their Team&lt;br/&gt;&lt;br/&gt;&lt;p&gt;That's nonsensical.&amp;nbsp; There's only one development team.&amp;nbsp; If that is not happening, bring it up and fix it.&amp;nbsp; You owe it to your teammates, all your teammates.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Teamwork means celebrating our diversity and how it binds us together.&amp;nbsp; We don't let a little bit of geography get in the way.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Our Chatrooms?&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Interact with your whole team in chat rooms early and often.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Interact with your whole team in chat rooms early and often.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Interact with your whole team in chat rooms early and often.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Notice that it doesn't say to interact with "our" team or any such.&amp;nbsp; Work with your whole team.&amp;nbsp; Otherwise, we end up with two separate teams.&amp;nbsp; And that's not valuable to anybody.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Don't Mute the Mic&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Never, ever mute the speakerphone's mic when having a meeting with your team, no matter who is at the other end.&amp;nbsp; If they are part of your team, the mic must be on all the time.&amp;nbsp; You have to assume that they want to participate fully in the meeting.&amp;nbsp; Cutting off the mic is just rude and a reminder of the physical separation.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If you were all physically in the same room, you would not send some of your teammates out of the room to have a "private" conversation.&amp;nbsp; And you would not have a separate conversation while somebody else is talking.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If you need to translate something, or clarify something in Spanish, or whatever, do it but &lt;i&gt;leave the mic on&lt;/i&gt;.&amp;nbsp; Think of it as everybody's chance to learn some Spanish.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/Ux64I5bG_uQ" height="1" width="1"/&gt;</description>
			<author>Matt Perez</author>
			<pubDate>Thu, 02 Aug 2012 16:19:39 +0100</pubDate>
		<category>workplace democracy</category>
 <category>Great Place to Work</category>
 <category>dignity</category>
 <category>culture</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/dignity-at-nearsoft.html</feedburner:origLink></item>
		<item>
			<title>Office Hours: A Little Help Goes a Long Way</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/nBz2bZo5XAQ/office-hours-a-little-help-goes-a-long-way.html</link>
			<description>&lt;p czcolor-0="1"&gt;The Office Hours program is a combination of remote training, extended interview, and therapy session.&amp;nbsp; Our experience so far is that with a little investment in time, a "so-so" candidate can turn into an awesome one.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://3.bp.blogspot.com/-fVafDLHIIrw/TVbaHr3oF9I/AAAAAAAABRo/__AxS2q5HRg/s320/retirement-gift-item-office-hours-300.jpg" czcolor-0="1" mce_src="http://3.bp.blogspot.com/-fVafDLHIIrw/TVbaHr3oF9I/AAAAAAAABRo/__AxS2q5HRg/s320/retirement-gift-item-office-hours-300.jpg" alt="Office Hours Sign" title="Office Hours Sign" height="248" width="320"&gt;&lt;p czcolor-0="1" style="font-family: helvetica, arial, sans-serif; font-size: 10px;"&gt;Source: Learning. Teaching. Learning.&lt;/p&gt;&lt;p&gt;At Nearsoft, we’re always looking for good people to join our ranks, responsible adults who love what they do, who live our values, and who will help us achieve our goals as a team and as a business.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p czcolor-0="1"&gt;To achieve that, we have a somewhat lengthy process of recruitment that consists of several phases.&amp;nbsp; Once the process is complete we hold a "Thumbs" meeting where we decide whether or not to extend an offer to join us.&amp;nbsp; You can read more about it in our FAQ.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;The Problem&lt;br/&gt;&lt;br/&gt;&lt;p czcolor-0="1"&gt;We provide pretty detailed feedback to all candidates we decide not to hire.&amp;nbsp; This includes a list of books, articles, training courses, and other training material to address the specific areas we feel the candidate needs to improve.&amp;nbsp; The recruiter in charge collects all the feedback and offers it back to the candidate.&amp;nbsp; In some cases, the interviewers go over the feedback directly with the candidates, particularly when it comes to technology.&lt;/p&gt;&lt;p czcolor-0="1"&gt; However, we felt that even with all this,&amp;nbsp; we weren’t doing enough to help these candidates do a better job in the future.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p czcolor-0="1"&gt;Beyond the list a list of training materials and one or two conversations, we pretty much left candidates on their own, without guidance.&amp;nbsp; We felt that we could do more to stay in touch and help more proactively.&amp;nbsp; Particularly when we run into very interesting people who may not be ready to &lt;br/&gt;join us but still make an impression on us and show that “spark” that &lt;br/&gt;we’re always looking for.&lt;br /&gt;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p czcolor-0="1"&gt;And this is how the Office Hours program was born.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Office Hours&lt;br/&gt;&lt;br/&gt;&lt;p czcolor-0="1"&gt;Now when we encounter a candidate with high potential we schedule a few hours during the week to get together with the candidate online.&amp;nbsp; Sometimes it is one hour every day, other times three to four hours a week.&amp;nbsp; Whatever works out for the candidate and her Nearsoft mentors.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p czcolor-0="1"&gt;During Office Hours we talk with the candidate about whatever area she's currently working to improve.&amp;nbsp; It may the training material, specific questions, or best practices and how we usually do things at Nearsoft.&amp;nbsp; In general, it’s an informal technical discussion where the main focus is on those areas of opportunity that we identified during the recruitment process.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p czcolor-0="1"&gt;We see many cases where really good people have picked up very bad habits from the places they've worked at.&amp;nbsp; At Nearsoft, we have the luxury of constantly learning from each other, from our clients, industry thought leaders, etc., and we get to use bleeding edge technologies to create awesome products.&amp;nbsp; This creates a pretty high bar for most developers who've never been challenged this way and are only expected to put in eight hours at the office and get the code out regardless of how scalable, maintainable, or satisfying the result may be.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;And It's Off!&lt;br/&gt;&lt;br/&gt;&lt;p czcolor-0="1"&gt;We just kicked off Office Hours program recently, with "Marco" as our first candidate.&amp;nbsp; He is a great guy who applied for a PHP position.&amp;nbsp; He made a very good impression on us and showed a passion for technology and the kind of things we do.&amp;nbsp; He wasn't quite ready but we felt, and he agreed, that the Office Hours program could give him the little push he needed.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p czcolor-0="1"&gt;For the past few weeks, we’ve been talking with him about Persistence Patterns, ORM (specifically, integrating Doctrine with Zend Framework), TDD, BDD and DDD and Unit Testing best practices and techniques.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p czcolor-0="1"&gt;The talks we’ve been having so far have been really great.&amp;nbsp; We clicked with Marco right away and have had really interesting conversations and debates.&amp;nbsp; He's already shown a lot of improvement, and, of course, we have learned something new along the way, too!&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;The Future&lt;br/&gt;&lt;br/&gt;&lt;p czcolor-0="1"&gt;So far, the Office Hours have proved to be a great improvement in our “follow up."&amp;nbsp; The candidate gets to improve quicker and faster than before, we get to keep the interest of a potential hire, and get to know that person better.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p czcolor-0="1"&gt;Furthermore, through this program we’re also making a small contribution towards our vision to spread our culture as much as possible and improve the state of technology practice and entrepreneurship south of the border.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p czcolor-0="1"&gt;Hopefully, we’ll have many more great experiences in the future, as we've had with Marco, and be able to develop the potential of great people that apply with us but need just a little push to get on board.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Make It Work for You, Too&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;p czcolor-0="1"&gt;We encourage other organizations to launch similar programs to help develop the technical community at large.&amp;nbsp; It will enrich your internal culture as well.&amp;nbsp; For our part, we will continue to share our experiences with this and similar programs.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/nBz2bZo5XAQ" height="1" width="1"/&gt;</description>
			<author>Jesus "Chuy" Martinez</author>
			<pubDate>Thu, 02 Aug 2012 15:42:17 +0100</pubDate>
		<category>training</category>
 <category>recruiting</category>
 <category>culture</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/office-hours-a-little-help-goes-a-long-way.html</feedburner:origLink></item>
		<item>
			<title>The Unboard: Untypical, Unbound and Unabashed</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/AXuLYEBzU0g/the-unboard-untypical-unbound-and-unabashed.html</link>
			<description>&lt;p&gt;&lt;img alt="Cartoon by Hugh MacLeod" title="A really different unconference" width="250" height="141" class="blog-hook-image" src="http://www.nearsoft.com/images/stories/nearsoft/blog/Unboard/really%20different%20unconference.jpg"&gt;Last Friday we kicked off the&lt;i&gt;&amp;nbsp;Unboard&lt;/i&gt;—a mechanism to broaden participation in the management and strategic direction of the company. This is not our first experiment along these lines, with mixed results. But the&lt;i&gt; Unboard&lt;/i&gt; is different and novel enough that it might do the trick.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Untypical&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Nearsoft is ranked as a Most Democratic Workplace and we're always looking for ways to get everybody involved at all levels of decisions. As a small company it's been easy enough to get a couple of people around food or drinks and discuss our latest challenges. However, as we grow, it gets harder to keep track of who's interested in what.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;At one of our Friday Talks, we talked about this and a proposal came up which eventually took shape as the&lt;i&gt; Unboard&lt;/i&gt;. In the spirit of the Uncola and Unconferences, an &lt;i&gt;Unboard&lt;/i&gt;, then,&amp;nbsp;is an untypical "Board," for people,&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;who are generally free-thinking, inquisitive and apt to rebel against authoritative structures&lt;br/&gt;&lt;br/&gt;&lt;p&gt;[from&amp;nbsp;the Library of Congroess blog]&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Unbound&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;img alt="High &amp;amp; Mighty Beer Co Logo" title="High &amp;amp; Mighty … Beer!" width="150" height="148" class="blog-hook-image" src="http://www.2beerguys.com/images/forblog/high_mighty_logo.jpg"&gt;Traditional Boards have a fixed number of seats reserved for the high and mighty, with fixed meeting dates, and held behind closed doors. We propose that the &lt;i&gt;Unboard&lt;/i&gt; meets as needed, driven by specific issues, embodied by the people most passionate about a particular topic and be streamed live openly.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Like Unconferences, &lt;i&gt;Unboards&lt;/i&gt; are, &lt;/p&gt;&lt;br/&gt;&lt;br/&gt;designed from the outset to be spontaneous, participant-driven and democratically directed. First of all, they're fun! Secondly, they offer an informal environment for people to share exploratory work and to test ideas.&lt;br/&gt;&lt;br/&gt;&lt;p&gt;[from&amp;nbsp;the Library of Congroess blog]&lt;/p&gt;&lt;p&gt;Each meeting of the Unboard will focus on a set of issues submitted by the Nearsoft folks. Anybody can then become part of the deliberations if they feel passionate enough about it.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Unabashed&lt;br/&gt;&lt;br/&gt;&lt;p&gt;We spend more time at the office (virtual or otherwise) than we do at home.  The office is the place where people work, eat, play, read, chat, and even&amp;nbsp;&lt;i&gt;sleep&lt;/i&gt;&lt;img class="blog-hook-image" width="250" height="167" alt="VPO sleeping" src="http://farm2.staticflickr.com/1316/4724445621_876e2f01ff.jpg"&gt;. It had better be an agreeable place that is not only comfortable and pleasant, but should also be enjoyable and &lt;i&gt;healthy&lt;/i&gt; in every sense.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;This is how the &lt;i&gt;Unboard&lt;/i&gt; was described in our Yammer network,&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;b&gt;What?&lt;/b&gt;&amp;nbsp;&lt;br/&gt;  It is a shared forum where we can express and expose any suggestion or issue we may have about our workplace. It is not a social network to discuss random topics. Rather, if you have an issue that you want to discuss or resolve, posted on&amp;nbsp;the&amp;nbsp;&lt;i&gt;Unboard&lt;/i&gt; agenda and we'll discuss it at our next meeting. These issues can be about the company's operations or strategy.&lt;br/&gt;  &lt;b&gt;Why?&lt;/b&gt;&amp;nbsp;&lt;br/&gt;  We need people to commit to creating and evolving this mechanism, to broaden participation in identifying and deciding on Nearsoft's operational and strategic issues.&lt;br/&gt;  &lt;b&gt;How?&lt;/b&gt;&amp;nbsp;&lt;br/&gt;  There is a Google spreadsheet to keep track of items up for discussion. Any of us can post to this document, either directly or via a form. We will review the list every week at the Friday talk and decide if and when the next meeting will take place.&lt;br/&gt;  &lt;b&gt;Who?&lt;/b&gt;&amp;nbsp;&lt;br/&gt;  You, me, and everybody else. In any other way this effort won’t last long and will be unsuccessful. We need full support from every individual and their willingness to cooperate!&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;So, Will This Work?&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Yes, if we all help by sharing our points of view and acknowledging the points of view of others. Most importantly, we must realize that only by collaborating we can make this a better place to work for everybody; we will be directly improving our own work environment and making this office more enjoyable for all of us.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Let's take the initiative to get ahead of potential problems (before they find us) and to innovate on how to make a Great Place to Work even greater.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/AXuLYEBzU0g" height="1" width="1"/&gt;</description>
			<author>Luis Galaz</author>
			<pubDate>Thu, 08 Mar 2012 18:04:32 +0100</pubDate>
		<category>workplace democracy</category>
 <category>unconference</category>
 <category>uncola</category>
 <category>unboard</category>
 <category>culture</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/the-unboard-untypical-unbound-and-unabashed.html</feedburner:origLink></item>
		<item>
			<title>PhoneGap: Rapid Android Development, 3/3</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/NtGawNKL8T4/phonegap-rapid-android-development-3-3.html</link>
			<description>&lt;p&gt;This post is the last of three where you can learn how to create a mobile app using PhoneGap.&amp;nbsp; In this final post, you'll learn how to build upon the code the code we have so far created to create a working Android app.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;img class="blog-hook-image" alt="PhoneGap build process" title="PhoneGap build process" width="400" src="ns/images/stories/nearsoft/blog/PhoneGap/image01.png"&gt;In this post, we will modify several Java and HTML files to correctly map for the Product object in your Salesforce account. If you haven't done so, yet, now would be a good time to review my previous post, where that's explained in detailed.&lt;/p&gt;&lt;p&gt;First we need to modify the Activity file , on my example It is called: PhoneGapAndroidActivity.java.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;  Change the code to contain the next structure and save it:&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  package com.example.android;&lt;br/&gt;&lt;br/&gt;import android.os.Bundle;&lt;br/&gt;import com.phonegap.DroidGap;&lt;br/&gt;&lt;br/&gt;public class PhoneGapAndroidActivity extends DroidGap {&lt;br/&gt;  /** Called when the activity is first created. */&lt;br/&gt;  @Override&lt;br/&gt;  public void onCreate(Bundle savedInstanceState) {&lt;br/&gt;    super.onCreate(savedInstanceState);&lt;br/&gt;    super.loadUrl("file:///android_asset/www/index.html");&lt;br/&gt;  }&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  Before changing the HTML code, it is important to verify that you have your free Salesforce development account. You have to make sure you have the Product  custom object already created to be able to continue with this tutorial. The Product custom object should have at least the Price field in it.&lt;br/&gt;  You should have something pretty similar to this in your Salesforce account.&lt;br/&gt;&lt;img alt="PhoneGap build process" title="PhoneGap build process" style="display: block; width: 512px; height: 237px;" src="ns/images/stories/nearsoft/blog/PhoneGap/post3-img01.png"&gt;&lt;br/&gt;  If you have that object like that, then you are ready to keep going. If not, follow the tutorial.&lt;br/&gt;  Inside Salesforce we have to prepare a Remote Site which will provide the way to get communicated using oAuth. Follow the next simple steps&lt;br/&gt;  &lt;br/&gt;    Go to Remote Access&lt;br/&gt;&lt;img alt="" title="" style="width: 194px; height: 328px;" src="ns/images/stories/nearsoft/blog/PhoneGap/post3-img02.png"&gt;&lt;br/&gt;    Create a new remote access. Specify the next required fields.&lt;br/&gt;&lt;img alt="" title="" style="width: 440px; height: 211px;" src="ns/images/stories/nearsoft/blog/PhoneGap/post3-img03.png"&gt;&lt;br/&gt;    After clicking on Save, you will get a very important string code.&lt;br/&gt;&lt;img alt="" title="" style="width: 440px; height: 53px;" src="ns/images/stories/nearsoft/blog/PhoneGap/post3-img04.png"&gt;&lt;br/&gt;    That Consumer Key will be used in our PhoneGap application to get authenticated using Salesforce.&lt;br/&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Modifying the HTML and JS Files&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Now it is time to modify the HTML file called Index.html. It includes the code from metadaddy-sfdc, but we are going to modify it to be able to run on Android and to use our own Salesforce account by mapping the Product custom object.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  Open the Index.html and edit the  tag with the next code:&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &amp;lt;head&amp;gt;&lt;br/&gt;  &amp;lt;title&amp;gt;Products&amp;lt;/title&amp;gt;&lt;br/&gt;  &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&amp;gt;&lt;br/&gt;  &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /&amp;gt;&lt;br/&gt;&lt;br/&gt;  &amp;lt;link rel="stylesheet" href="static/jquery.mobile-1.0a4.1.min.css" /&amp;gt;&lt;br/&gt;  &amp;lt;script type="text/javascript" src="static/jquery-1.5.2.min.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;  &amp;lt;script type="text/javascript" src="static/jquery.mobile-1.0a4.1.min.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;  &amp;lt;script type="text/javascript" src="static/forcetk.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;  &amp;lt;script type="text/javascript" src="static/mobileapp.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;  &amp;lt;script type="text/javascript" charset="utf-8" src="phonegap.0.9.5.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;  &amp;lt;script type="text/javascript" charset="utf-8" src="childbrowser.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;  &amp;lt;script type="text/javascript"&amp;gt;&lt;br/&gt;&lt;br/&gt;  // OAuth Configuration&lt;br/&gt;  var loginUrl = 'https://login.salesforce.com/';&lt;br/&gt;  var clientId = '3MVG9yZ.WNe6byQDOtUfpo5TK.XDRz4.G9p3O3QytKIJraSlaz8ix4Yqm6VRmzDW3csPF_vQ9oSBQq82hHFRs';&lt;br/&gt;  var redirectUri = 'https://login.salesforce.com/services/oauth2/success';&lt;br/&gt;  var client = new forcetk.Client(clientId, loginUrl);&lt;br/&gt;&lt;br/&gt;  // Make our own startsWith utility fn&lt;br/&gt;  String.prototype.startsWith = function(str) {&lt;br/&gt;    return (this.substr(0, str.length) === str);&lt;br/&gt;  }&lt;br/&gt;&lt;br/&gt;  function getAuthorizeUrl(loginUrl, clientId, redirectUri) {&lt;br/&gt;    return loginUrl + 'services/oauth2/authorize?display=touch'&lt;br/&gt;                    + '&amp;amp;response_type=token&amp;amp;client_id=' + escape(clientId)&lt;br/&gt;                    + '&amp;amp;redirect_uri=' + escape(redirectUri);&lt;br/&gt;  }&lt;br/&gt;&lt;br/&gt;  function sessionCallback(oauthResponse) {&lt;br/&gt;    client.setSessionToken(oauthResponse.access_token, null, oauthResponse.instance_url);&lt;br/&gt;&lt;br/&gt;    addClickListeners();&lt;br/&gt;&lt;br/&gt;    $j('#logoutbtn').click(function(e) {&lt;br/&gt;      client.setRefreshToken(null);&lt;br/&gt;      $j.mobile.changePage('#loginpage', "slide", false, true);&lt;br/&gt;      $j.mobile.pageLoading();&lt;br/&gt;      window.plugins.childBrowser.onLocationChange = function(loc) {&lt;br/&gt;        if (loc.startsWith(redirectUri)) {&lt;br/&gt;          window.plugins.childBrowser.close();&lt;br/&gt;          oauthCallback(unescape(loc));&lt;br/&gt;        }&lt;br/&gt;      };&lt;br/&gt;&lt;br/&gt;      window.plugins.childBrowser.showWebPage(getAuthorizeUrl(loginUrl, clientId, redirectUri));&lt;br/&gt;    });&lt;br/&gt;&lt;br/&gt;    $j.mobile.changePage('#mainpage', "slide", false, true);&lt;br/&gt;    $j.mobile.pageLoading();&lt;br/&gt;    getProducts(function() {&lt;br/&gt;      $j.mobile.pageLoading(true);&lt;br/&gt;    });&lt;br/&gt;  }&lt;br/&gt;&lt;br/&gt;  function oauthCallback(loc) {&lt;br/&gt;    var oauthResponse = {};&lt;br/&gt;&lt;br/&gt;    var fragment = loc.split("#")[1];&lt;br/&gt;&lt;br/&gt;    if (fragment) {&lt;br/&gt;      var nvps = fragment.split('&amp;amp;');&lt;br/&gt;      for (var nvp in nvps) {&lt;br/&gt;        var parts = nvps[nvp].split('=');&lt;br/&gt;        oauthResponse[parts[0]] = unescape(parts[1]);&lt;br/&gt;      }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    if (typeof oauthResponse === 'undefined' || typeof oauthResponse['access_token'] === 'undefined') {&lt;br/&gt;      errorCallback({&lt;br/&gt;        status: 0,&lt;br/&gt;        statusText: 'Unauthorized',&lt;br/&gt;        responseText: 'No OAuth response'&lt;br/&gt;      });&lt;br/&gt;    } else {&lt;br/&gt;      sessionCallback(oauthResponse);&lt;br/&gt;    }&lt;br/&gt;  }&lt;br/&gt;&lt;br/&gt;  // We use $j rather than $ for jQuery&lt;br/&gt;  if (window.$j === undefined) {&lt;br/&gt;    $j = $;&lt;br/&gt;  }&lt;br/&gt;			&lt;br/&gt;  $j(document).ready(function() {&lt;br/&gt;    document.addEventListener("deviceready", onDeviceReady, false);&lt;br/&gt;&lt;br/&gt;    function onDeviceReady() {&lt;br/&gt;      window.plugins.childBrowser.onLocationChange = function(loc) {&lt;br/&gt;        if (loc.startsWith(redirectUri)) {&lt;br/&gt;          window.plugins.childBrowser.close();&lt;br/&gt;          oauthCallback(unescape(loc));&lt;br/&gt;        }&lt;br/&gt;      };&lt;br/&gt;      window.plugins.childBrowser.showWebPage(getAuthorizeUrl(loginUrl, clientId, redirectUri));&lt;br/&gt;    }&lt;br/&gt;  });&lt;br/&gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;/head&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Note: I have modified the original source file to use the correct method names that work with Android versions.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  It is very important that you change the clientIdwith the consumer key you got from Saleforce while creating the remote Access.&lt;br /&gt;&lt;br/&gt;var clientId =&amp;nbsp;&amp;nbsp;&amp;nbsp; '3MVG9yZ.WNe6byQDOtUfpo5TK.XDRz4.G9p3O3QytKIJraSlaz8ix4Yqm6VRmzDW3csPF_vQ9oSBQq82hHFRs';&lt;br/&gt;  Save the file.Now modify the tag with this code and save the file&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &amp;lt;body&amp;gt;&lt;br/&gt;  &amp;lt;div data-role="page" data-theme="b" id="loginpage"&amp;gt;&lt;br/&gt;    &amp;lt;div data-role="header"&amp;gt;&lt;br/&gt;      &amp;lt;h1&amp;gt;Login&amp;lt;/h1&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;    &amp;lt;div data-role="content" style="margin-left: auto; margin-right: auto; text-align: center;"&amp;gt;&lt;br/&gt;        Connecting to Force.com&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;    &amp;lt;div data-role="footer"&amp;gt;&lt;br/&gt;      &amp;lt;h4&amp;gt;Force.com&amp;lt;/h4&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;  &amp;lt;/div&amp;gt;&lt;br/&gt;  &amp;lt;div data-role="page" data-theme="b" id="mainpage"&amp;gt;&lt;br/&gt;    &amp;lt;div data-role="header" data-backbtn="false"&amp;gt;&lt;br/&gt;      &amp;lt;h1&amp;gt;Product List&amp;lt;/h1&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;    &amp;lt;div data-role="content"&amp;gt;&lt;br/&gt;      &amp;lt;form&amp;gt;&lt;br/&gt;        &amp;lt;button data-role="button" id="newbtn"&amp;gt;New&amp;lt;/button&amp;gt;&lt;br/&gt;      &amp;lt;/form&amp;gt;&lt;br/&gt;      &amp;lt;ul id="productlist" data-inset="true" data-role="listview" &lt;br/&gt;        data-theme="c" data-dividertheme="b"&amp;gt;&lt;br/&gt;      &amp;lt;/ul&amp;gt;&lt;br/&gt;      &amp;lt;form&amp;gt;&lt;br/&gt;        &amp;lt;button data-role="button" id="logoutbtn"&amp;gt;Logout&amp;lt;/button&amp;gt;&lt;br/&gt;      &amp;lt;/form&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;    &amp;lt;div data-role="footer"&amp;gt;&lt;br/&gt;      &amp;lt;h4&amp;gt;Force.com&amp;lt;/h4&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;  &amp;lt;/div&amp;gt;&lt;br/&gt;  &amp;lt;div data-role="page" data-theme="b" id="detailpage"&amp;gt;&lt;br/&gt;    &amp;lt;div data-role="header"&amp;gt;&lt;br/&gt;      &amp;lt;h1&amp;gt;Product Detail&amp;lt;/h1&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;  &amp;lt;div data-role="content"&amp;gt;&lt;br/&gt;    &amp;lt;table&amp;gt;&lt;br/&gt;      &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Product Name:&amp;lt;/td&amp;gt;&amp;lt;td id="Name"&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br/&gt;      &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Price:&amp;lt;/td&amp;gt;&amp;lt;td id="Price__c"&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br/&gt;    &amp;lt;/table&amp;gt;&lt;br/&gt;    &amp;lt;form name="productdetail" id="productdetail"&amp;gt;&lt;br/&gt;      &amp;lt;input type="hidden" name="Id" id="Id" /&amp;gt;&lt;br/&gt;      &amp;lt;button data-role="button" id="editbtn"&amp;gt;Edit&amp;lt;/button&amp;gt;&lt;br/&gt;      &amp;lt;button data-role="button" id="deletebtn" data-icon="delete" data-theme="e"&amp;gt;Delete&amp;lt;/button&amp;gt;&lt;br/&gt;      &amp;lt;/form&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;    &amp;lt;div data-role="footer"&amp;gt;&lt;br/&gt;      &amp;lt;h4&amp;gt;Force.com&amp;lt;/h4&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;  &amp;lt;/div&amp;gt;&lt;br/&gt;        &lt;br/&gt;  &amp;lt;div data-role="page" data-theme="b" id="editpage"&amp;gt;&lt;br/&gt;    &amp;lt;div data-role="header"&amp;gt;&lt;br/&gt;      &amp;lt;h1 id="productformheader"&amp;gt;New Product&amp;lt;/h1&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;    &amp;lt;div data-role="content"&amp;gt;&lt;br/&gt;      &amp;lt;form name="productform" id="productform"&amp;gt;&lt;br/&gt;        &amp;lt;input type="hidden" name="Id" id="Id" /&amp;gt;&lt;br/&gt;        &amp;lt;table&amp;gt;&lt;br/&gt;          &amp;lt;tr&amp;gt;&lt;br/&gt;            &amp;lt;td&amp;gt;Product Name:&amp;lt;/td&amp;gt;&lt;br/&gt;            &amp;lt;td&amp;gt;&amp;lt;input name="Name" id="Name" data-theme="c"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br/&gt;          &amp;lt;/tr&amp;gt;&lt;br/&gt;          &amp;lt;tr&amp;gt;&lt;br/&gt;            &amp;lt;td&amp;gt;Price:&amp;lt;/td&amp;gt;&lt;br/&gt;            &amp;lt;td&amp;gt;&amp;lt;input name="Price__c" id="Price__c" data-theme="c"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br/&gt;          &amp;lt;/tr&amp;gt;&lt;br/&gt;        &amp;lt;/table&amp;gt;&lt;br/&gt;        &amp;lt;button data-role="button" id="actionbtn"&amp;gt;Action&amp;lt;/button&amp;gt;&lt;br/&gt;      &amp;lt;/form&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;    &amp;lt;div data-role="footer"&amp;gt;&lt;br/&gt;      &amp;lt;h4&amp;gt;Force.com&amp;lt;/h4&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;  &amp;lt;/div&amp;gt;&lt;br/&gt;&amp;lt;/body&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  Open the mobileapp.js SPAN. We are going to modify some methods that will provide the product list, we won’t cover all the functionality, we just need to modify the method that displays the product list. In later chapters we could extend the complete functionality like: Edit, create, delete, etc.&lt;br/&gt;  Locate the method called getAccounts SPAN, and replace all that method with the next method and save the file:&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  // Populate the Products list and set up click handling&lt;br/&gt;function getProducts(callback) {&lt;br/&gt;  $j('#productlist').empty();&lt;br/&gt;  client.query("SELECT Id, Name, Price__c FROM Product__c ORDER BY Name LIMIT 20",&lt;br/&gt;    function(response) {&lt;br/&gt;      $j.each(response.records,&lt;br/&gt;      function() {&lt;br/&gt;        var id = this.Id;&lt;br/&gt;        $j('&amp;lt;li&amp;gt;&amp;lt;/li&amp;gt;')&lt;br/&gt;        .hide()&lt;br/&gt;        .append('&amp;lt;a href="#"&amp;gt;&amp;lt;h2&amp;gt;' + this.Name + ' - price : $' + this.Price__c+ '&amp;lt;/h2&amp;gt;&amp;lt;/a&amp;gt;')&lt;br/&gt;        .click(function(e) {&lt;br/&gt;          e.preventDefault();&lt;br/&gt;          $j.mobile.pageLoading();&lt;br/&gt;          // We could do this more efficiently by adding Industry and&lt;br/&gt;          // TickerSymbol to the fields in the SELECT, but we want to&lt;br/&gt;          // show dynamic use of the retrieve function...&lt;br/&gt;          client.retrieve("Product__c", id, "Name,Id,Price__c",&lt;br/&gt;            function(response) {&lt;br/&gt;              $j('#Name').html(response.Name);&lt;br/&gt;              $j('#Price__c').html(response.Price__c);&lt;br/&gt;              $j('#Id').val(response.Id);&lt;br/&gt;              $j.mobile.pageLoading(true);&lt;br/&gt;              $j.mobile.changePage('#detailpage', "slide", false, true);&lt;br/&gt;            }, errorCallback);&lt;br/&gt;        })&lt;br/&gt;      .appendTo('#productlist')&lt;br/&gt;      .show();&lt;br/&gt;    });&lt;br/&gt;&lt;br/&gt;    $j('#productlist').listview('refresh');&lt;br/&gt;&lt;br/&gt;    if (typeof callback != 'undefined' &amp;amp;&amp;amp; callback != null) {&lt;br/&gt;      callback();&lt;br/&gt;    }&lt;br/&gt;  }, errorCallback);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  Run the project as an Android application.&lt;br/&gt;&lt;img alt="" title="" style="width: 477px; height: 320px;" src="ns/images/stories/nearsoft/blog/PhoneGap/post3-img05.png"&gt;&lt;br/&gt;  The AVD (Android Virtual Device) should open and deploy your code into the Android emulator you already have configured.&lt;br/&gt;  You are rocking now!&lt;br/&gt;&lt;img mce_src="ns/images/stories/nearsoft/blog/PhoneGap/screenshot01.png" height="252" width="155" src="ns/images/stories/nearsoft/blog/PhoneGap/screenshot01.png"&gt;&lt;img mce_src="ns/images/stories/nearsoft/blog/PhoneGap/screenshot02.png" height="252" width="177" src="ns/images/stories/nearsoft/blog/PhoneGap/screenshot02.png"&gt;&lt;img mce_src="ns/images/stories/nearsoft/blog/PhoneGap/post3-img08.png" height="252" width="169" src="ns/images/stories/nearsoft/blog/PhoneGap/post3-img08.png"&gt;&lt;img mce_src="ns/images/stories/nearsoft/blog/PhoneGap/post3-img09.png" height="252" width="153" src="ns/images/stories/nearsoft/blog/PhoneGap/post3-img09.png"&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;If you want to see the code already running , take a look at my personal GIT repository and play with it.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/NtGawNKL8T4" height="1" width="1"/&gt;</description>
			<author>Salvador Mora</author>
			<pubDate>Fri, 03 Feb 2012 22:28:30 +0100</pubDate>
		<category>salesforce</category>
 <category>phonegap</category>
 <category>mobile</category>
 <category>javascript</category>
 <category>iOS</category>
 <category>Android</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/phonegap-rapid-android-development-3-3.html</feedburner:origLink></item>
		<item>
			<title>PhoneGap: Rapid Android Development, 2/3</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/SjAcbq4QrCQ/phonegap-rapid-android-development-2-3.html</link>
			<description>&lt;p&gt;In this post, you will learn how to create a "Hello world" Android app from scratch, using Eclipse.&amp;nbsp; This post includes links to metadaddy-sfdc, where you'll find all the files you'll need to complete the app.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;img src="/ns/images/stories/nearsoft/blog/PhoneGap/image01.png" class="blog-hook-image" mce_src="/ns/images/stories/nearsoft/blog/PhoneGap/image01.png" alt="PhoneGap build process" title="PhoneGap build process" width="400"&gt;In a previous post, I described how to build a simple iOS app using PhoneGap for iOS.&amp;nbsp; To keep things in balance, in this post I'll walk you through how to build a very simple Android app using PhoneGap for Android.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;For this example it is very important to be familiar with the Android development tools. But, if you are not, don’t worry, I was in the same place not that very long ago. Just follow the steps in this tutorial to complete the "Hello Android" example.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Setting Things Up&lt;br/&gt;&lt;br/&gt;&lt;p&gt;The first step is to set up your environment.&amp;nbsp; Go to the Android developers site where you can find a step-by-step tutorial to do this and all the necessary resources.&amp;nbsp; Once you're done with that, come back to this tutorial.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;At this point you should be able to create a new Android Project using Eclipse.&amp;nbsp; Go ahead and do this now.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;b&gt;Note&lt;/b&gt;: For this example I am using a Salesforce account to create all the database information and access all the objects will be needed to run the Android app. Creating a developer account is very simple, just go to Salesforce.com and create a &lt;i&gt;free&lt;/i&gt; developer account.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;In a previous post I've detailed how to create a Salesforce account and new objects.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Getting the Files&lt;br/&gt;&lt;br/&gt;&lt;p&gt;To keep things simple, we are going to use the example provided by metadaddy-sfdc.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;   You need to get the complete repository provided at his site.&lt;br/&gt;  You should already be familiar with how to clone a repository.&amp;nbsp; If not, no worries, it is pretty simple.&amp;nbsp; Simply follow the steps in this tutorial.&lt;br/&gt;  You will find several files in that folder just cloned, but we will only need these files,&lt;br /&gt;&lt;br/&gt;    &lt;br/&gt;      forcetk.js&lt;br/&gt;      mobileapp.js&lt;br/&gt;      phonegap.html&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;  You now need to download these files,&lt;br /&gt;&lt;br/&gt;    &lt;br/&gt;      childbrowser.js (Android version) &lt;br/&gt;      phonegap.0.9.5.js&amp;nbsp; (Use this specific version, Google it and download it) &lt;br/&gt;      jquery.mobile-1.0a4.1.min.js &lt;br/&gt;      jquery.mobile-1.0a4.1.min.css&lt;br/&gt;      jquery-1.5.2.min.js &lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;b&gt;Note&lt;/b&gt;: In order to make this work, I had to download these specific file versions, specially the PhoneGap file and the childBrowser. Try downloading exactly the same file versions.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Adding Files to the Project&lt;br/&gt;&lt;br/&gt;&lt;p&gt;After creating a new project in Eclipse you should see this folder structure,&lt;br /&gt;&lt;br/&gt;&lt;img src="/ns/images/stories/nearsoft/blog/PhoneGap/post2-img01.png" style="width: 400px; height: 424px; display: block; margin: 6px auto" mce_src="/ns/images/stories/nearsoft/blog/PhoneGap/post2-img01.png" alt="New Project in folder hierarchy" title="New Project in folder hierarchy"&gt;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;It should be pretty similar to what you have, the only difference will be the ProjectName (PhoneGapAndroid) and the Activity file class name (PhoneGapAndroidActivity.java).&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  You will need to add a folder structure and move the files you downloaded into it.&amp;nbsp; Your folder should look like this,&lt;br /&gt;&lt;br/&gt;&lt;img src="/ns/images/stories/nearsoft/blog/PhoneGap/post2-img02.png" style="width: 396px; height: 424px; display: block; margin: 6px auto" mce_src="/ns/images/stories/nearsoft/blog/PhoneGap/post2-img02.png" alt="Assets" title="Assets"&gt;&lt;br /&gt;  Here a quick explanation of what's going on,&lt;br/&gt;    &lt;br/&gt;      The www folder must be created. Copy the childBroswer.js file, phonegap0.9.5.js and the© phonegap.html file on it. Rename the file phonegap.html to index.html—it is a mandatory.&lt;br/&gt;      The folder childbrowser must be created.&amp;nbsp; Include the PNG files you got in the childbrowser download.&lt;br/&gt;      Create the folder static and populate it withe files indicated in the picture above.&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;  You need to create a folder as in this picture,&lt;br /&gt;&lt;br/&gt;&lt;img src="/ns/images/stories/nearsoft/blog/PhoneGap/post2-img03.png" style="width: 312px; height: 158px; display: block; margin: 6px auto" mce_src="/ns/images/stories/nearsoft/blog/PhoneGap/post2-img03.png" alt="Source hierarchy" title="Source hierarchy"&gt;&lt;br/&gt;  Now create a "libs" folder under your project name on Eclipse and copy the phonegap-1.2.0.jar into it, then you have to add the Jar to the libraries of the project. Go to Project Properties, click on "Java build path," add the phonegap library, and click OK. &lt;img src="/ns/images/stories/nearsoft/blog/PhoneGap/post2-img04.png" style="width: 512px; height: 412px; display: block; margin: 6px auto" mce_src="/ns/images/stories/nearsoft/blog/PhoneGap/post2-img04.png" alt="Libs folder" title="Libs folder"&gt;&lt;br/&gt;  Now all the references should be good, without compilation issues.&lt;br/&gt;  Open the AndroidManifest.xml file and code-and-paste this code into it,&lt;br/&gt; &lt;br/&gt;  &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"&lt;br/&gt;    package=" com.example.android"&lt;br/&gt;    android:versionCode="1"&lt;br/&gt;    android:versionName="1.0" &amp;gt;&lt;br/&gt;&lt;br/&gt;    &amp;lt;uses-sdk android:minSdkVersion="14" /&amp;gt;&lt;br/&gt;&lt;br/&gt;    &amp;lt;supports-screens&lt;br/&gt;        android:largeScreens="true"&lt;br/&gt;        android:normalScreens="true"&lt;br/&gt;        android:smallScreens="true"&lt;br/&gt;        android:resizeable="true"&lt;br/&gt;        android:anyDensity="true"&lt;br/&gt;        /&amp;gt;&lt;br/&gt;        &amp;lt;uses-permission android:name="android.permission.CAMERA" /&amp;gt;&lt;br/&gt;        &amp;lt;uses-permission android:name="android.permission.VIBRATE" /&amp;gt;&lt;br/&gt;        &amp;lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&amp;gt;&lt;br/&gt;        &amp;lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /&amp;gt;&lt;br/&gt;        &amp;lt;uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /&amp;gt;&lt;br/&gt;        &amp;lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&amp;gt;&lt;br/&gt;        &amp;lt;uses-permission android:name="android.permission.INTERNET" /&amp;gt;&lt;br/&gt;        &amp;lt;uses-permission android:name="android.permission.RECEIVE_SMS" /&amp;gt;&lt;br/&gt;        &amp;lt;uses-permission android:name="android.permission.RECORD_AUDIO" /&amp;gt;&lt;br/&gt;        &amp;lt;uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /&amp;gt;&lt;br/&gt;        &amp;lt;uses-permission android:name="android.permission.READ_CONTACTS" /&amp;gt;&lt;br/&gt;        &amp;lt;uses-permission android:name="android.permission.WRITE_CONTACTS" /&amp;gt;&lt;br/&gt;   &lt;br/&gt;        &amp;lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&amp;gt;   &lt;br/&gt;        &amp;lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&amp;gt;&lt;br /&gt;&lt;br/&gt;    &amp;lt;application&lt;br/&gt;        android:icon="@drawable/ic_launcher"&lt;br/&gt;        android:label="@string/app_name" &amp;gt;&lt;br/&gt;&lt;br/&gt;        &amp;lt;activity&lt;br/&gt;            android:label="@string/app_name"&lt;br/&gt;            android:name=".PhoneGapAndroidActivity" &lt;br/&gt;            android:configChanges="orientation|keyboardHidden"&lt;br/&gt;            &amp;gt;&lt;br/&gt;            &amp;lt;intent-filter &amp;gt;&lt;br/&gt;                &amp;lt;action android:name="android.intent.action.MAIN" /&amp;gt;&lt;br /&gt;&lt;br/&gt;                &amp;lt;category android:name="android.intent.category.LAUNCHER" /&amp;gt;&lt;br/&gt;            &amp;lt;/intent-filter&amp;gt;&lt;br/&gt;        &amp;lt;/activity&amp;gt;&lt;br/&gt;        &amp;lt;activity android:name="com.phonegap.DroidGap" android:label="@string/app_name"&amp;gt;&lt;br/&gt; 		&amp;lt;intent-filter&amp;gt;&lt;br/&gt; 		&amp;lt;/intent-filter&amp;gt;&lt;br/&gt; 	&amp;lt;/activity&amp;gt;&lt;br/&gt;    &amp;lt;/application&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/manifest&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;b&gt;Note&lt;/b&gt;: in the android:name attribute we are using our "PhoneGapAndroidActivity".&amp;nbsp; You should use your own name, if you have chosen a different one.&lt;/p&gt;&lt;br/&gt;  If you get a prompt asking to update the schema, click Accept.&lt;br/&gt;  Create a folder named phonegap.xml as in this picture,&lt;br /&gt;&lt;br/&gt;&lt;img src="/ns/images/stories/nearsoft/blog/PhoneGap/post2-img05.png" style="width: 261px; height: 270px; display: block; margin: 6px auto" mce_src="/ns/images/stories/nearsoft/blog/PhoneGap/post2-img05.png" alt="Create phonegap.xml" title="Create phonegap.xml"&gt;&lt;br/&gt;  Inside the XML folder, create a file named phonegap.xml with this code,&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br/&gt;&amp;lt;phonegap&amp;gt;&lt;br/&gt;    &amp;lt;access origin="http://127.0.0.1*"/&amp;gt;&lt;br/&gt;    &amp;lt;log level="DEBUG"/&amp;gt;&lt;br/&gt;&amp;lt;/phonegap&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  Inside the XML folder, create a file named plugins.xml with this code,&lt;br/&gt;  &lt;br/&gt;    &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br/&gt;&amp;lt;plugins&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="App" value="com.phonegap.App"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="Geolocation" value="com.phonegap.GeoBroker"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="Device" value="com.phonegap.Device"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="Accelerometer" value="com.phonegap.AccelListener"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="Compass" value="com.phonegap.CompassListener"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="Media" value="com.phonegap.AudioHandler"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="Camera" value="com.phonegap.CameraLauncher"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="Contacts" value="com.phonegap.ContactManager"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="Crypto" value="com.phonegap.CryptoHandler"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="File" value="com.phonegap.FileUtils"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="Network Status" value="com.phonegap.NetworkManager"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="Notification" value="com.phonegap.Notification"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="Storage" value="com.phonegap.Storage"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="Temperature" value="com.phonegap.TempListener"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="FileTransfer" value="com.phonegap.FileTransfer"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="Capture" value="com.phonegap.Capture"/&amp;gt;&lt;br/&gt;    &amp;lt;plugin name="ChildBrowser" value="com.phonegap.plugins.childBrowser.ChildBrowser"/&amp;gt;&lt;br/&gt;&amp;lt;/plugins&amp;gt;&lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Well, you should now be ready to go, with all files in the correct place.&amp;nbsp; However, the app will not work, yet.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;We first have to modify the Index.html file because it is using the iOS code.&amp;nbsp; According to the examples from metadaddy-sfdc, we have to modify several parameters in order to connect to Salesforce.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Also, depending on the business logic, we may have to modify the object mappings the application will use to prompt in the dialog. I have used my own database, but in the next post I'll map out these objects for my previous post.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;In my next post, I'm going to map the "PRODUCT object" so we can use it in the Android application.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/SjAcbq4QrCQ" height="1" width="1"/&gt;</description>
			<author>Salvador Mora</author>
			<pubDate>Thu, 02 Feb 2012 06:31:56 +0100</pubDate>
		<category>salesforce</category>
 <category>phonegap</category>
 <category>mobile</category>
 <category>javascript</category>
 <category>iOS</category>
 <category>Android</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/phonegap-rapid-android-development-2-3.html</feedburner:origLink></item>
		<item>
			<title>PhoneGap: Rapid Mobile Development, 1/3</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/DKVjJCsYSEk/phonegap-rapid-mobile-development-1-3.html</link>
			<description>&lt;p&gt;Phonegap is a new Javascript framework that I have been testing lately to get familiar with this rapid mobile development environment.&amp;nbsp; It is impressive to see how you can build a native Android app by using only HTML, CSS and Javascript.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;I think at this point any web developer must know those languages. Just by using that code that already works and include the Phonegap.js file,&amp;nbsp; set some parameters and then you will be ready to be running your first native android or iOS application. It sounds like a magical trick, but I have seen it working for a customer and the result is very nice.&lt;/p&gt;  &lt;p&gt;The jQuery mobile framework provides a very interesting user interface, pretty similar to other mobile user interface you have already seen.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;How It Works&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;img src="ns/images/stories/nearsoft/blog/PhoeneGap/image01.png" class="blog-hook-image" mce_src="ns/images/stories/nearsoft/blog/PhoeneGap/image01.png" alt="PhoneGap build process" title="PhoneGap build process" width="400"&gt;The picture shows how PhoneGap works, like a translator from "normal" HTML code to the native language of your target mobile platform.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Personally, I have seen how PhoneGap for Android works and it is pretty nice. I have seen some code samples for iOS but I have not tried it out on that platform, yet.&lt;/p&gt;  &lt;p&gt;You can find out more about PhoneGap for iOS here, where you'll find an example provided by metadaddy-sfdc. They have encapsulated all the logic in a toolkit to provide authentication specifically for the Salesforce framework using oAuth 2.0.&lt;/p&gt;  &lt;p&gt;The main trick is that PhoneGap needs to use an internal browser to make all the calls inside the Android or iOS device. In this example, it uses ChildBrowser for iOS, but in my personal testing I have modified it to use the Android version.&lt;/p&gt;    &lt;p&gt;Here are sample pictures of my first Android application using PhoneGap using oAuth to authenticate with Salesforce.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;img src="/ns/images/stories/nearsoft/blog/PhoeneGap/screenshot01.png" mce_src="/ns/images/stories/nearsoft/blog/PhoeneGap/screenshot01.png" alt="Screenshot" title="Screenshot" height="252"&gt; &lt;img src="/ns/images/stories/nearsoft/blog/PhoeneGap/screenshot02.png" mce_src="/ns/images/stories/nearsoft/blog/PhoeneGap/screenshot02.png" alt="Screenshot" title="Screenshot" height="252"&gt; &lt;img src="/ns/images/stories/nearsoft/blog/PhoeneGap/screenshot03.png" mce_src="/ns/images/stories/nearsoft/blog/PhoeneGap/screenshot03.png" alt="Screenshot" title="Screenshot" height="252"&gt;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;In future posts I will have more detail on how to use PhoneGap for Android, ChildBrowser for Android, jQueryMobile, etc.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/DKVjJCsYSEk" height="1" width="1"/&gt;</description>
			<author>Salvador Mora</author>
			<pubDate>Thu, 26 Jan 2012 19:39:27 +0100</pubDate>
		<category>salesforce</category>
 <category>phonegap</category>
 <category>mobile</category>
 <category>javascript</category>
 <category>iOS</category>
 <category>Android</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/phonegap-rapid-mobile-development-1-3.html</feedburner:origLink></item>
		<item>
			<title>Working with Fonts and Railo</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/24fPgFzyhkI/working-with-fonts-and-railo.html</link>
			<description>&lt;p&gt;While trying to work with fonts in Railo I found a pretty radical bug. &amp;nbsp;This is about the work around I found to make it all work.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;img class="blog-hook-image" mce_src="http://www.a2hosting.com/i/railo_hosting.gif" alt="Railo Logo" width="200" height="128" src="http://www.a2hosting.com/i/railo_hosting.gif"&gt;&lt;br/&gt;I was using ColdFusion MX (&lt;i&gt;i.e.&lt;/i&gt;, the cfdocument tag) to generate some reports and it was working OK. However, we've recently switched to Railo and its tag implementation had severe issues generating JCK fonts. While ColdFusion uses iText for generating a PDF, Railo uses PD4ML (you can get the general idea from&amp;nbsp;this site, with help from Google Translate and some imagination).&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;PD4ML has a severe issue (&lt;i&gt;i.e.&lt;/i&gt;, bug) regarding fonts. It doesn't use the default Swing/AWT mechanism for generating texts, instead it looks for TTF defined fonts in the fonts.jar file (WEB-INF/lib/fonts.jar). The reasons behind this are explained in this page. What's more, this mechanism only supports TTF (not TTC) fonts, so it was kind of hard locating a font with the following conditions:&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  Sans&lt;br/&gt;  TTF Distributed&lt;br/&gt;  Similar to Arial&lt;br/&gt;  Supporting JCK (at least)&lt;br/&gt;  Free to use and distribute&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;This last point is important: since you have to embed the font within the PDF, the license is important. If you embed the font, then you're not just&amp;nbsp;&lt;i&gt;using&lt;/i&gt; it, you are also&amp;nbsp;&lt;i&gt;distributing&lt;/i&gt; it. So even if I used the Unicode variant of Arial, as far as I could tell, there would be issues because we were distributing it to other systems. The closest fit I found was the "Droid Sans Fallback" theme, under the Apache License.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Since PD4ML is completely based on CSS for generating the document, I had to change all the font-family directives to "Droid Sans Fallback" and leave sans-serif as an hypothetical fallback (&lt;i&gt;i.e.&lt;/i&gt;, this should never happen). There doesn't seem to be that much difference, but you may want to double check for your particular reports. Also if you're not using Arial then good luck finding a Pan-Unicode font similar to the one you were using.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;After that the steps for generating Japanese-Chinese-Korean reports in Railo are:&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  Modify the fonts.jar file (add your TTF file and its mapping in the config file)&lt;br/&gt;  Modify your PDF CSS (so the font-family directive asks for the new Font and uses the previous one as a Fallback)&lt;br/&gt;  Restart your server&lt;br/&gt;  Enjoy!&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/24fPgFzyhkI" height="1" width="1"/&gt;</description>
			<author>Vicente Plata</author>
			<pubDate>Mon, 21 Nov 2011 18:54:20 +0100</pubDate>
		<category>TTF</category>
 <category>software development</category>
 <category>Railo</category>
 <category>PD4ML</category>
 <category>JCK</category>
 <category>iText</category>
 <category>ColdFusion</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/working-with-fonts-and-railo.html</feedburner:origLink></item>
		<item>
			<title>Learning to Use Haml</title>
			<link>http://feedproxy.google.com/~r/nearsoft/blog/~3/z83iQciq8VE/learning-to-use-haml.html</link>
			<description>&lt;p&gt;"&lt;i&gt;If you sit down and try using Haml, you will learn it within 20 minutes&lt;/i&gt;" from html-lang.com.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;I won't say this is true… but it kind of is.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;What is Haml?&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Haml is an abstraction markup language, a layer on top of HTML. It's a way of writing more beautiful and faster markup.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;With Haml,&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  You avoid writing redundant code, like closing tags.&lt;br/&gt;  You leverage your knowledge of CSS selectors.&lt;br/&gt;  You write views faster.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Haml by Example &lt;br /&gt;&lt;p&gt;Now let's look at an example of a basic structure,&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    &lt;br/&gt;!!! 5&lt;br /&gt;%html&lt;br/&gt;&amp;nbsp; %head&lt;br/&gt;&amp;nbsp; &amp;nbsp; %title my title&lt;br/&gt;&amp;nbsp; %body&lt;br/&gt;&amp;nbsp; &amp;nbsp; #main&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; %span#my-span my content&lt;br/&gt;&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;This would render as:&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    &lt;br/&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br/&gt;&amp;lt;html&amp;gt;&lt;br/&gt;&amp;nbsp; &amp;lt;head&amp;gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;lt;title&amp;gt;my title&amp;lt;/title&amp;gt;&lt;br/&gt;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;br/&gt;&amp;nbsp; &amp;lt;body&amp;gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;lt;div id='main'&amp;gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;span id='my-span'&amp;gt;my content&amp;lt;/span&amp;gt;&lt;br/&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br/&gt;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;br/&gt;&amp;lt;/html&amp;gt;&lt;br/&gt;&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Whitespace is important to Haml, but it doesn't matter if you use blanks or tabs as long as you're consistent (me, I'm more of a space-guy).&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Use % to create a tag,&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    This Haml code&lt;br/&gt;    &amp;nbsp;&lt;br/&gt;    Renders as&lt;br/&gt;  &lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    &lt;br/&gt;%body&lt;br/&gt;%div&lt;br/&gt;&lt;br/&gt;    &lt;br/&gt;    &lt;br/&gt;    &amp;nbsp;&lt;br/&gt;    &lt;br/&gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&lt;br/&gt;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br/&gt;&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;You can add content to an element by indenting a level below,&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    This Haml code&lt;br/&gt;    &amp;nbsp;&lt;br/&gt;    Renders as&lt;br/&gt;  &lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    &lt;br/&gt;%span&lt;br/&gt;&amp;nbsp; content&lt;br/&gt;&lt;br/&gt;    &lt;br/&gt;    &amp;nbsp;&lt;br/&gt;    &lt;br/&gt;&amp;lt;span&amp;gt;&lt;br/&gt;&amp;nbsp; content&lt;br/&gt;&amp;lt;/span&amp;gt;&lt;br/&gt;&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Or by entering a space,&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    This Haml code&lt;br/&gt;    &amp;nbsp;&lt;br/&gt;    Renders as&lt;br/&gt;  &lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    &lt;br/&gt;%span content&lt;br/&gt;    &lt;br/&gt;    &amp;nbsp;&lt;br/&gt;    &lt;br/&gt;&amp;lt;span&amp;gt;content&amp;lt;/span&amp;gt;&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;HTML tags are passed unmodified&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    This Haml code&lt;br/&gt;    &amp;nbsp;&lt;br/&gt;    Renders as&lt;br/&gt;  &lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    &lt;br/&gt;&amp;lt;html&amp;gt;&lt;br /&gt;%body&lt;br/&gt;&amp;lt;/html&amp;gt;&lt;br/&gt;&lt;br/&gt;    &lt;br/&gt;    &amp;nbsp;&lt;br/&gt;    &lt;br/&gt;&amp;lt;html&amp;gt;&lt;br/&gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&lt;br/&gt;&amp;lt;/html&amp;gt;&lt;br/&gt;&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;There are two ways of adding attributes: {} or ()&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;You can use the Ruby hash notation:&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    This Haml code&lt;br/&gt;  &lt;br/&gt;  &lt;br/&gt;    &lt;br/&gt;%link{:rel =&amp;gt; 'stylesheet', :type =&amp;gt; 'text/css', :href =&amp;gt; '/css/styles.css'}&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;  &lt;br/&gt;    &amp;nbsp;&lt;br/&gt;  &lt;br/&gt;  &lt;br/&gt;    Renders as&lt;br/&gt;  &lt;br/&gt;  &lt;br/&gt;    &lt;br/&gt;&amp;lt;link href='/css/styles.css' rel='stylesheet' type='text/css' /&amp;gt;&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Or the parens notation, which is more HTML-ish:&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    This Haml code&lt;br/&gt;  &lt;br/&gt;  &lt;br/&gt;    &lt;br/&gt;%link(rel='stylesheet' type='text/css' href='/css/styles.css')&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;  &lt;br/&gt;    &amp;nbsp;&lt;br/&gt;  &lt;br/&gt;  &lt;br/&gt;    Renders as&lt;br/&gt;  &lt;br/&gt;  &lt;br/&gt;    &lt;br/&gt;&amp;lt;link href='/css/styles.css' rel='stylesheet' type='text/css' /&amp;gt;&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;There's a shortcut, using CSS selector syntax, for including IDs and/or classes to an element. As in CSS, use the # character for the ID and the dot for a class:&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    This Haml code&lt;br/&gt;    &amp;nbsp;&lt;br/&gt;    Renders as&lt;br/&gt;  &lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    &lt;br/&gt;#container&lt;br/&gt;&amp;nbsp; %span.red text here&lt;br/&gt;&lt;br/&gt;    &lt;br/&gt;    &amp;nbsp;&lt;br/&gt;    &lt;br/&gt;&amp;lt;div id='container'&amp;gt;&lt;br/&gt;&amp;nbsp; &amp;lt;span class='red'&amp;gt;text here&amp;lt;/span&amp;gt;&lt;br/&gt;&amp;lt;/div&amp;gt;&lt;br/&gt;&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;As you can see the &amp;lt;div&amp;gt; element is implied when no tag was specified. These two lines would render the same:&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    This Haml code&lt;br/&gt;    &amp;nbsp;&lt;br/&gt;    Renders as&lt;br/&gt;  &lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    &lt;br/&gt;%div#container&lt;br/&gt;#container&lt;br/&gt;&lt;br/&gt;    &lt;br/&gt;    &amp;nbsp;&lt;br/&gt;    &lt;br/&gt;&amp;lt;div id='container'&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id='container'&amp;gt;&amp;lt;/div&amp;gt;&lt;br/&gt;&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;For the Web Standardistas, Haml provides pretty much any DOCTYPE you'd need:&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;br/&gt;    This Haml code&lt;br/&gt;  &lt;br/&gt;  &lt;br/&gt;    &lt;br/&gt;!!!&lt;br/&gt;!!! Strict&lt;br/&gt;!!! 5&lt;br/&gt;&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;  &lt;br/&gt;    &amp;nbsp;&lt;br/&gt;  &lt;br/&gt;  &lt;br/&gt;    Renders as&lt;br/&gt;  &lt;br/&gt;  &lt;br/&gt;    &lt;br/&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;br/&gt;  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br/&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"&lt;br/&gt;  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;br/&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br/&gt;    &lt;br/&gt;  &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;But, Wait … There's More! &lt;br /&gt;&lt;p&gt;And there's also escaping, enconding, outputing HTML4, XHTML, HMLT5, filters and much else.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;So dive into the Haml reference and try it out now.&amp;nbsp; And, please, let me know what you think of it.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/nearsoft/blog/~4/z83iQciq8VE" height="1" width="1"/&gt;</description>
			<author>Alejandro Beltran</author>
			<pubDate>Fri, 11 Nov 2011 19:44:41 +0100</pubDate>
		<category>markup language</category>
 <category>haml</category>
		<feedburner:origLink>http://www.nearsoft.com/blog/learning-to-use-haml.html</feedburner:origLink></item>
	</channel>
</rss>
